application · active
TopoloWeb
Chat-first website platform with a signed-in studio, Nexus-backed agent planning, Worker control plane, Astro runtime, publish snapshots, domains, forms, assets, and launch QA.
Documentation map
- Topolo Web — Build, preview, quality-check, publish, and recover responsive websites through a typed agent workflow.
Authority and runtime
- System ID
topolo-web- App IDs
- app_topolo_web
- Owners
- product-platform
- Repositories
- apps/TopoloWeb
- Hosts
- https://web.topolo.app, https://web-api.topolo.app, https://sites.topolo.app, https://web.stg.topolo.us, https://web-api.stg.topolo.us, https://sites.stg.topolo.us
- Dependencies
- topolo-platform, topolo-auth, topolo-one, applications-packages, cloud-control
Security and data ownership
- Risk tier
- high
- Tenant isolation
- organization_scoped
- Privacy classification
- restricted
- Storage
- d1, external_provider, kv
- Export and deletion
- planned
- Enterprise ready
- no
Source-derived capability inventory
Source revisions: apps/TopoloWeb@30bfa2a69264ff4adb674121bac9ed20f407bf6b
Declared actions: 44 · API routes: 5 · UI routes: 0
{
"id": "topolo-web",
"name": "TopoloWeb",
"slug": "topolo-web",
"kind": "application",
"visibility": "public",
"repo_paths": [
"apps/TopoloWeb"
],
"source_revisions": [
{
"source_path": "apps/TopoloWeb",
"repository": "apps/TopoloWeb",
"revision": "30bfa2a69264ff4adb674121bac9ed20f407bf6b",
"ref": "origin/staging"
}
],
"source_counts": {
"source_files": 169,
"test_files": 84,
"test_cases": 0,
"migration_files": 8,
"database_tables": 0,
"manifests": 1,
"deploy_targets": 3,
"actions": 44,
"mobile_contracts": 1,
"notifications": 7,
"package_manifests": 8,
"deployment_configs": 1
},
"manifests": [
{
"source_path": "apps/TopoloWeb/topolo.app.json",
"service_slug": "topolo-web",
"name": "topoloweb",
"app_id": "app_topolo_web",
"compatibility_date": "2026-04-10",
"primary_target": null,
"environments": [
"development",
"production",
"staging"
],
"targets": [
{
"name": "web",
"kind": "worker",
"directory": "apps/web",
"main": "src/worker.ts",
"worker_name": "topolo-web-studio",
"subdomain": "web",
"healthcheck_path": null,
"variable_names": [
"AUTH_API_URL",
"INSIGHTS_SITE_KEY"
],
"secret_names": [],
"bindings": [
{
"kind": "services",
"binding": "API",
"target": null
}
]
},
{
"name": "api",
"kind": "worker",
"directory": "apps/api",
"main": "src/index.ts",
"worker_name": "topolo-web-api",
"subdomain": null,
"healthcheck_path": "/health",
"variable_names": [
"ENVIRONMENT",
"FRONTEND_URL",
"NEXUS_GATEWAY_URL",
"NEXUS_MODEL",
"NEXUS_PROVIDER",
"RUNTIME_URL",
"TOPOLO_AUTH_API_URL",
"TOPOLO_NOTIFY_URL"
],
"secret_names": [],
"bindings": [
{
"kind": "d1",
"binding": "TOPOLOWEB_CONTROL_DB",
"target": null
},
{
"kind": "d1",
"binding": "TOPOLOWEB_CONTENT_DB",
"target": null
},
{
"kind": "d1",
"binding": "TOPOLOWEB_EVENTS_AGENT_DB",
"target": null
},
{
"kind": "kv",
"binding": "TOPOLOWEB_PUBLISHED_KV",
"target": null
}
]
},
{
"name": "runtime",
"kind": "worker",
"directory": "apps/runtime",
"main": "@astrojs/cloudflare/entrypoints/server",
"worker_name": "topolo-web-runtime",
"subdomain": null,
"healthcheck_path": "/health",
"variable_names": [],
"secret_names": [],
"bindings": [
{
"kind": "kv",
"binding": "SESSION",
"target": null
}
]
}
],
"notifications": [
"web.build.completed",
"web.build.failed",
"web.collection.import_failed",
"web.domain.verification_failed",
"web.domain.verification_required",
"web.site.published",
"web.site.unpublished"
],
"notification_contract": {
"source_path": "topolo.notification-contracts.json",
"role": "producer",
"schema_version": 1,
"owner_app_id": "app_topolo_web",
"events": [
{
"type": "web.build.completed",
"version": 1,
"description": "A requested site build completed and its site state was persisted.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at",
"build_id",
"site_id",
"site_name"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"build_id": {
"type": "string",
"minLength": 1
},
"site_id": {
"type": "string",
"minLength": 1
},
"site_name": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": true
},
"examples": [
{
"title": "Site build completed: Northstar",
"body": "The generated site is ready to review.",
"object_id": "webbuild_1",
"occurred_at": "2026-07-20T00:00:00.000Z",
"build_id": "webbuild_1",
"site_id": "site_1",
"site_name": "Northstar"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^web:build-completed:"
},
"sensitiveFields": []
},
{
"type": "web.build.failed",
"version": 1,
"description": "A requested site build failed and the terminal attempt was persisted.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at",
"build_id",
"site_name",
"reason"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"build_id": {
"type": "string",
"minLength": 1
},
"site_name": {
"type": "string",
"minLength": 1
},
"reason": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": true
},
"examples": [
{
"title": "Site build failed: Northstar",
"body": "The site payload could not be built.",
"object_id": "webbuild_2",
"occurred_at": "2026-07-20T00:00:00.000Z",
"build_id": "webbuild_2",
"site_name": "Northstar",
"reason": "invalid_build_payload"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^web:build-failed:"
},
"sensitiveFields": []
},
{
"type": "web.collection.import_failed",
"version": 1,
"description": "A collection CSV import failed and the terminal attempt was persisted.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at",
"import_id",
"site_id",
"collection_slug",
"reason"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"import_id": {
"type": "string",
"minLength": 1
},
"site_id": {
"type": "string",
"minLength": 1
},
"collection_slug": {
"type": "string",
"minLength": 1
},
"reason": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": true
},
"examples": [
{
"title": "Collection import failed: products",
"body": "The collection CSV was rejected.",
"object_id": "webcollectionimport_1",
"occurred_at": "2026-07-20T00:00:00.000Z",
"import_id": "webcollectionimport_1",
"site_id": "site_1",
"collection_slug": "products",
"reason": "invalid_headers"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^web:collection-import-failed:"
},
"sensitiveFields": []
},
{
"type": "web.domain.verification_failed",
"version": 1,
"description": "A custom-domain DNS verification attempt failed and was persisted.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at",
"site_id",
"domain_id",
"hostname",
"reason"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"site_id": {
"type": "string",
"minLength": 1
},
"domain_id": {
"type": "string",
"minLength": 1
},
"hostname": {
"type": "string",
"minLength": 1
},
"reason": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": true
},
"examples": [
{
"title": "Domain verification failed: www.example.com",
"body": "The required DNS records were not visible.",
"object_id": "domain_1",
"occurred_at": "2026-07-20T00:00:00.000Z",
"site_id": "site_1",
"domain_id": "domain_1",
"hostname": "www.example.com",
"reason": "dns_records_missing"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^web:domain-verification-failed:"
},
"sensitiveFields": []
},
{
"type": "web.domain.verification_required",
"version": 1,
"description": "A custom domain was persisted and requires DNS ownership verification.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at",
"site_id",
"domain_id",
"hostname",
"dns_target",
"verification_token"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"site_id": {
"type": "string",
"minLength": 1
},
"domain_id": {
"type": "string",
"minLength": 1
},
"hostname": {
"type": "string",
"minLength": 1
},
"dns_target": {
"type": "string",
"minLength": 1
},
"verification_token": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": true
},
"examples": [
{
"title": "Verify www.example.com",
"body": "Add the required DNS records.",
"object_id": "domain_1",
"occurred_at": "2026-07-20T00:00:00.000Z",
"site_id": "site_1",
"domain_id": "domain_1",
"hostname": "www.example.com",
"dns_target": "sites.topolo.app",
"verification_token": "verify_123"
}
],
"dataClassification": "confidential",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^web:domain-verification-required:"
},
"sensitiveFields": [
"verification_token"
]
},
{
"type": "web.site.published",
"version": 1,
"description": "A site version was published and persisted.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at",
"site_id",
"version_id",
"version_number"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"site_id": {
"type": "string",
"minLength": 1
},
"version_id": {
"type": "string",
"minLength": 1
},
"version_number": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": true
},
"examples": [
{
"title": "Site published: Northstar",
"body": "Version 2 is now live.",
"object_id": "site_1",
"occurred_at": "2026-07-20T00:00:00.000Z",
"site_id": "site_1",
"version_id": "version_2",
"version_number": 2
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^web:site-published:"
},
"sensitiveFields": []
},
{
"type": "web.site.unpublished",
"version": 1,
"description": "A published site was moved back to draft and its public cache was purged.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at",
"site_id"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"site_id": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": true
},
"examples": [
{
"title": "Site unpublished: Northstar",
"body": "The public site is no longer serving its published version.",
"object_id": "site_1",
"occurred_at": "2026-07-20T00:00:00.000Z",
"site_id": "site_1"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^web:site-unpublished:"
},
"sensitiveFields": []
}
]
},
"actions": [
{
"name": "organizations.data.export",
"title": "Export organization data",
"description": "Export all TopoloWeb workspaces, sites, content, submissions, agent activity, operational records, and uploaded-asset metadata owned by the authenticated organization without preview, domain-verification, or client-address credentials.",
"permission": "privacy:read",
"method": "GET",
"path": "/api/organizations/data/export",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/organizations/data/export",
"body": null
},
"effects": "Reads state through GET /api/organizations/data/export without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/organizations/data/export",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "organizations.data.erase",
"title": "Erase organization data",
"description": "Permanently erase all TopoloWeb data owned by the authenticated organization across control, content, events and agent databases plus published KV objects while retaining backups under policy.",
"permission": "privacy:write",
"method": "DELETE",
"path": "/api/organizations/data/erase",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"confirmation": {
"type": "string",
"const": "ERASE"
}
},
"required": [
"confirmation"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"confirmation": "ERASE"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/organizations/data/erase",
"body": null
},
"effects": "May change state through DELETE /api/organizations/data/erase. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/organizations/data/erase",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "workspaces.delete",
"title": "Delete workspace",
"description": "Permanently delete an empty, non-default TopoloWeb workspace.",
"permission": "workspace:delete",
"method": "DELETE",
"path": "/api/workspaces/{workspaceId}",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspaceId"
],
"additionalProperties": false
},
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"ok": {
"type": "boolean",
"const": true
},
"workspaceId": {
"type": "string",
"minLength": 1
}
},
"required": [
"ok",
"workspaceId"
],
"additionalProperties": false
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/web#workspace-management",
"resource": {
"kind": "workspace",
"idPath": "workspaceId"
},
"effects": [
"Confirms the TopoloWeb workspace is empty, then asks Topolo Auth to archive its canonical identity."
],
"errors": [
{
"status": 409,
"code": "workspace_delete_blocked",
"recovery": "Remove owned sites or select another default workspace, then retry the deletion."
}
],
"verify": [
"Call app_topolo_auth.workspaces.list and confirm the archived workspace id is absent."
],
"nextActionIds": [
"app_topolo_auth.workspaces.list"
]
},
"documentation": {
"example_input": {
"workspaceId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/workspaces/example",
"body": null
},
"effects": "Confirms the TopoloWeb workspace is empty, then asks Topolo Auth to archive its canonical identity.",
"verification": [
"Call app_topolo_auth.workspaces.list and confirm the archived workspace id is absent."
],
"recovery": [
"409 workspace_delete_blocked: Remove owned sites or select another default workspace, then retry the deletion."
],
"docs_url": "https://docs.topolo.app/applications/web#workspace-management",
"resource": {
"kind": "workspace",
"idPath": "workspaceId"
},
"next_action_ids": [
"app_topolo_auth.workspaces.list"
],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/workspaces/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "forms.submissions.create",
"title": "Forms Submissions Create",
"description": "Call POST /forms/{formId}/submissions.",
"method": "POST",
"path": "/api/forms/{formId}/submissions",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"formId": {
"type": "string",
"minLength": 1
},
"siteId": {
"type": "string",
"minLength": 1
},
"pageId": {
"type": "string",
"minLength": 1
},
"turnstileToken": {
"type": "string",
"minLength": 1
},
"cf-turnstile-response": {
"type": "string",
"minLength": 1
}
},
"required": [
"formId",
"siteId",
"pageId"
],
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
}
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Forms Submissions Create.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "public",
"documentation": {
"example_input": {
"formId": "example",
"siteId": "example",
"pageId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/forms/example/submissions",
"body": {
"formId": "example",
"siteId": "example",
"pageId": "example"
}
},
"effects": "May change state through POST /api/forms/{formId}/submissions. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/forms/*/submissions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.create",
"title": "Sites Create",
"description": "Call POST /studio/sites.",
"method": "POST",
"path": "/api/studio/sites",
"permission": "studio:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"intent": {
"type": "string",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"minLength": 1
},
"audience": {
"type": "string",
"minLength": 1
},
"offer": {
"type": "string",
"minLength": 1
},
"tone": {
"type": "string",
"minLength": 1
},
"location": {
"type": "string",
"minLength": 1
},
"differentiators": {
"type": "array",
"items": {
"type": "string"
}
},
"goals": {
"type": "array",
"items": {
"type": "string"
}
},
"prompt": {
"type": "string",
"minLength": 1
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Create.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"name": "example",
"businessType": "example",
"audience": "example",
"offer": "example",
"tone": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites",
"body": {
"name": "example",
"businessType": "example",
"audience": "example",
"offer": "example",
"tone": "example"
}
},
"effects": "May change state through POST /api/studio/sites. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"id": "app_topolo_web.sites.build",
"name": "sites.build",
"title": "Build site from canonical content",
"description": "Create a TopoloWeb site from a full canonical SiteContent payload and optionally publish it. This is the agent-safe Topolo Developers action path for Codex, Claude, CLI, and MCP site builds.",
"method": "POST",
"path": "/api/studio/sites/build",
"permission": "studio:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Build TopoloWeb site",
"type": "object",
"description": "Create a site from complete canonical content and optionally publish it.",
"properties": {
"site": {
"$ref": "#/$defs/createSite"
},
"content": {
"$ref": "#/$defs/siteContent"
},
"publish": {
"type": "boolean",
"description": "Publish the first immutable version after quality validation."
},
"publishLabel": {
"type": "string",
"description": "Optional first-version label.",
"minLength": 1
}
},
"required": [
"site",
"content"
],
"additionalProperties": false,
"$defs": {
"jsonValue": {
"description": "A JSON-compatible component property value.",
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/jsonValue"
}
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
}
]
},
"actionLink": {
"type": "object",
"description": "A rendered call-to-action link.",
"properties": {
"label": {
"type": "string",
"description": "Visible link label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, mailto, tel, or HTTPS URL.",
"minLength": 1
},
"linkKind": {
"type": "string",
"description": "Whether the link targets a TopoloWeb page or a custom URL.",
"enum": [
"custom",
"page"
]
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"label",
"href"
],
"additionalProperties": false
},
"navigationItem": {
"type": "object",
"description": "One site navigation entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable navigation item identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Visible navigation label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, or external URL.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Navigation emphasis.",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"description": "Optional parent item identifier for one-level menus."
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
},
"navigationMenu": {
"type": "object",
"description": "A named reusable navigation menu.",
"properties": {
"id": {
"type": "string",
"description": "Stable menu identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable menu name.",
"minLength": 1
},
"placement": {
"type": "string",
"description": "Custom menu placement marker.",
"const": "custom"
},
"items": {
"type": "array",
"description": "Ordered menu entries.",
"items": {
"$ref": "#/$defs/navigationItem"
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
},
"pageStyleDefaultsBase": {
"type": "object",
"description": "Site-wide default layout and typography values.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
}
},
"additionalProperties": false
},
"pageStyleDefaults": {
"type": "object",
"description": "Desktop page defaults with optional viewport overrides.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
},
"responsive": {
"type": "object",
"description": "Viewport-specific page-default overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/pageStyleDefaultsBase"
}
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"description": "Complete TopoloWeb theme and responsive page defaults.",
"properties": {
"primary": {
"type": "string",
"description": "Primary brand color.",
"minLength": 1
},
"secondary": {
"type": "string",
"description": "Secondary brand color.",
"minLength": 1
},
"surface": {
"type": "string",
"description": "Primary surface color.",
"minLength": 1
},
"ink": {
"type": "string",
"description": "Primary text color.",
"minLength": 1
},
"muted": {
"type": "string",
"description": "Muted text color.",
"minLength": 1
},
"accent": {
"type": "string",
"description": "Accent color.",
"minLength": 1
},
"accentSoft": {
"type": "string",
"description": "Soft accent surface color.",
"minLength": 1
},
"glow": {
"type": "string",
"description": "Decorative glow color.",
"minLength": 1
},
"headingFont": {
"type": "string",
"description": "CSS heading font stack.",
"minLength": 1
},
"bodyFont": {
"type": "string",
"description": "CSS body font stack.",
"minLength": 1
},
"radius": {
"type": "string",
"description": "Default CSS corner radius.",
"minLength": 1
},
"brandLogoUrl": {
"type": "string",
"description": "HTTPS brand-logo URL."
},
"brandLogoAlt": {
"type": "string",
"description": "Accessible brand-logo description."
},
"brandLogoWidth": {
"type": "string",
"description": "CSS brand-logo width."
},
"brandLogoHeight": {
"type": "string",
"description": "CSS brand-logo height."
},
"pageDefaults": {
"$ref": "#/$defs/pageStyleDefaults"
},
"customCss": {
"type": "string",
"description": "Reviewed site-wide CSS loaded after generated styles."
}
},
"required": [
"primary",
"secondary",
"surface",
"ink",
"muted",
"accent",
"accentSoft",
"glow",
"headingFont",
"bodyFont",
"radius"
],
"additionalProperties": false
},
"sectionStyleBase": {
"type": "object",
"description": "Desktop section style values.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
}
},
"additionalProperties": false
},
"sectionStyle": {
"type": "object",
"description": "Section style values with optional responsive overrides.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
},
"responsive": {
"type": "object",
"description": "Viewport-specific section-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItemStyleBase": {
"type": "object",
"description": "Desktop repeated-item style values.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
}
},
"additionalProperties": false
},
"sectionItemStyle": {
"type": "object",
"description": "Repeated-item style values with optional responsive overrides.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
},
"responsive": {
"type": "object",
"description": "Viewport-specific item-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionItemStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItem": {
"type": "object",
"description": "One repeated card, row, quote, metric, question, or media item.",
"properties": {
"id": {
"type": "string",
"description": "Stable item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title."
},
"body": {
"type": "string",
"description": "Visible supporting copy."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional value or price."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
},
"styleClassIds": {
"type": "array",
"description": "Reusable item style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"sectionValue": {
"type": "object",
"description": "Renderer-backed block content without persisted child arrays.",
"properties": {
"id": {
"type": "string",
"description": "Stable section identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"eyebrow": {
"type": "string",
"description": "Optional eyebrow copy."
},
"title": {
"type": "string",
"description": "Visible section heading."
},
"body": {
"type": "string",
"description": "Visible section body copy."
},
"kicker": {
"type": "string",
"description": "Optional supporting kicker."
},
"primaryAction": {
"$ref": "#/$defs/actionLink"
},
"secondaryAction": {
"$ref": "#/$defs/actionLink"
},
"imageUrl": {
"type": "string",
"description": "Optional section image URL."
},
"alt": {
"type": "string",
"description": "Accessible section-image description."
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"styleClassIds": {
"type": "array",
"description": "Reusable section style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
},
"style": {
"$ref": "#/$defs/sectionStyle"
},
"formId": {
"type": "string",
"description": "Form identifier for a contact-form block."
},
"collectionSlug": {
"type": "string",
"description": "Collection slug bound to this block."
},
"collectionLimit": {
"type": "number",
"description": "Maximum collection entries rendered.",
"minimum": 1
},
"collectionSort": {
"type": "string",
"description": "Collection sorting behavior.",
"enum": [
"manual",
"title_asc",
"title_desc",
"meta_asc",
"meta_desc"
]
},
"html": {
"type": "string",
"description": "Reviewed HTML for embed-capable blocks."
},
"videoUrl": {
"type": "string",
"description": "Direct, YouTube, or Vimeo video URL."
},
"videoProvider": {
"type": "string",
"description": "Video provider.",
"enum": [
"direct",
"youtube",
"vimeo"
]
},
"videoPosterUrl": {
"type": "string",
"description": "Video poster image URL."
},
"videoAutoplay": {
"type": "boolean",
"description": "Autoplay video when allowed."
},
"videoControls": {
"type": "boolean",
"description": "Show native video controls."
},
"videoMuted": {
"type": "boolean",
"description": "Mute video playback."
},
"componentName": {
"type": "string",
"description": "Approved custom component name."
},
"componentProps": {
"type": "object",
"description": "Component-specific reviewed JSON properties.",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
},
"menuId": {
"type": "string",
"description": "Reusable menu identifier bound to a menu block."
}
},
"required": [
"id",
"kind",
"title",
"body"
],
"additionalProperties": false
},
"pageValue": {
"type": "object",
"description": "Persisted page metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable page identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Root-relative page slug beginning with /.",
"pattern": "^/"
},
"title": {
"type": "string",
"description": "Visible page heading and title-template input.",
"minLength": 1
},
"description": {
"type": "string",
"description": "Page search and social description."
}
},
"required": [
"id",
"slug",
"title",
"description"
],
"additionalProperties": false
},
"columnValue": {
"type": "object",
"description": "Persisted layout-column metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable column identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional editor label."
},
"span": {
"type": "number",
"description": "Grid span.",
"minimum": 1
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Original product-domain identity for a document node.",
"properties": {
"kind": {
"type": "string",
"description": "Source record kind.",
"enum": [
"page",
"section",
"column",
"item"
]
},
"id": {
"type": "string",
"description": "Source record identifier.",
"minLength": 1
}
},
"required": [
"kind",
"id"
],
"additionalProperties": false
},
"pageNode": {
"type": "object",
"description": "A canonical page node owning exactly one page-body slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "page"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Parent node identifier when nested."
},
"source": {
"$ref": "#/$defs/source"
},
"value": {
"$ref": "#/$defs/pageValue"
},
"children": {
"type": "array",
"description": "Exactly one page-body slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"value",
"children"
],
"additionalProperties": false
},
"slotNode": {
"type": "object",
"description": "A canonical child slot controlling accepted node kinds.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "slot"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning page, layout, or block node identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"slotKind": {
"type": "string",
"description": "Child-slot role.",
"enum": [
"page-body",
"layout-column",
"block-items"
]
},
"accepts": {
"type": "array",
"description": "Document node kinds allowed in this slot.",
"items": {
"type": "string",
"description": "One allowed node kind.",
"enum": [
"layout",
"block",
"item"
]
}
},
"parentSectionId": {
"type": "string",
"description": "Owning section identifier for layout and block slots."
},
"columnId": {
"type": "string",
"description": "Column identifier for layout-column slots."
},
"value": {
"$ref": "#/$defs/columnValue"
},
"children": {
"type": "array",
"description": "Canonical child nodes.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"slotKind",
"accepts",
"children"
],
"additionalProperties": false
},
"layoutNode": {
"type": "object",
"description": "A canonical layout block owning one or more layout-column slots.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "layout"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"layoutKind": {
"type": "string",
"description": "Layout behavior.",
"enum": [
"container",
"grid",
"stack",
"flex-row",
"columns"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Layout-column slots.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"layoutKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"blockNode": {
"type": "object",
"description": "A canonical renderer block with optional block-items slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "block"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"blockKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Optional block-items slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"blockKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"itemNode": {
"type": "object",
"description": "A canonical repeated-item leaf node.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "item"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning block-items slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"parentSectionId": {
"type": "string",
"description": "Owning block section identifier.",
"minLength": 1
},
"itemId": {
"type": "string",
"description": "Persisted item identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionItem"
},
"children": {
"type": "array",
"description": "Item nodes are leaves and must have no children.",
"maxItems": 0
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"parentSectionId",
"itemId",
"value",
"children"
],
"additionalProperties": false
},
"siteDocumentNode": {
"description": "One canonical TopoloWeb document node.",
"oneOf": [
{
"$ref": "#/$defs/pageNode"
},
{
"$ref": "#/$defs/slotNode"
},
{
"$ref": "#/$defs/layoutNode"
},
{
"$ref": "#/$defs/blockNode"
},
{
"$ref": "#/$defs/itemNode"
}
]
},
"siteDocument": {
"type": "object",
"description": "Canonical versioned TopoloWeb document tree.",
"properties": {
"version": {
"type": "integer",
"description": "Document schema version.",
"const": 1
},
"pages": {
"type": "array",
"description": "Canonical page nodes.",
"items": {
"$ref": "#/$defs/pageNode"
}
}
},
"required": [
"version",
"pages"
],
"additionalProperties": false
},
"styleClass": {
"description": "A reusable section or item style class.",
"oneOf": [
{
"type": "object",
"description": "Reusable section style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "section"
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Reusable repeated-item style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "item"
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
},
"collectionItem": {
"type": "object",
"description": "One reusable CMS collection entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection-item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title.",
"minLength": 1
},
"body": {
"type": "string",
"description": "Visible item body."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional price or value."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"collection": {
"type": "object",
"description": "Reusable CMS collection.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Stable collection slug.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Collection content kind.",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"description": "Human-readable collection label.",
"minLength": 1
},
"items": {
"type": "array",
"description": "Ordered collection entries.",
"items": {
"$ref": "#/$defs/collectionItem"
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
},
"codeSnippet": {
"type": "object",
"description": "Reviewed bounded code injection.",
"properties": {
"id": {
"type": "string",
"description": "Stable snippet identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable snippet label.",
"minLength": 1
},
"slot": {
"type": "string",
"description": "Injection slot.",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string",
"description": "Reviewed HTML, CSS, or JavaScript source."
},
"enabled": {
"type": "boolean",
"description": "Whether this snippet is active."
}
},
"required": [
"id",
"label",
"slot",
"code",
"enabled"
],
"additionalProperties": false
},
"seo": {
"type": "object",
"description": "Site-wide search and social metadata defaults.",
"properties": {
"titleTemplate": {
"type": "string",
"description": "Title template; %s is replaced by the page title."
},
"metaTitle": {
"type": "string",
"description": "Default page title override."
},
"metaDescription": {
"type": "string",
"description": "Default search and social description."
},
"faviconUrl": {
"type": "string",
"description": "Browser and bookmark icon URL."
},
"openGraphImageUrl": {
"type": "string",
"description": "Default Open Graph image URL."
},
"canonicalUrl": {
"type": "string",
"description": "Canonical site URL."
}
},
"additionalProperties": false
},
"siteContent": {
"type": "object",
"description": "Complete canonical TopoloWeb site content.",
"properties": {
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"siteTitle": {
"type": "string",
"description": "Public site title.",
"minLength": 1
},
"siteDescription": {
"type": "string",
"description": "Public site description."
},
"contactEmail": {
"type": "string",
"description": "Public contact email.",
"minLength": 1
},
"contactPhone": {
"type": "string",
"description": "Optional public contact phone number."
},
"navigation": {
"type": "array",
"description": "Primary site navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"footerNavigation": {
"type": "array",
"description": "Footer navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"menus": {
"type": "array",
"description": "Reusable custom menus.",
"items": {
"$ref": "#/$defs/navigationMenu"
}
},
"styleClasses": {
"type": "array",
"description": "Reusable section and item styles.",
"items": {
"$ref": "#/$defs/styleClass"
}
},
"theme": {
"$ref": "#/$defs/theme"
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"description": "Reusable CMS collections.",
"items": {
"$ref": "#/$defs/collection"
}
},
"codeSnippets": {
"type": "array",
"description": "Reviewed bounded code snippets.",
"items": {
"$ref": "#/$defs/codeSnippet"
}
},
"seo": {
"$ref": "#/$defs/seo"
}
},
"required": [
"intent",
"siteTitle",
"siteDescription",
"contactEmail",
"navigation",
"footerNavigation",
"menus",
"styleClasses",
"theme",
"document",
"collections",
"codeSnippets"
],
"additionalProperties": false
},
"createSite": {
"type": "object",
"description": "Brief used to create a new TopoloWeb site.",
"properties": {
"name": {
"type": "string",
"description": "Internal and initial public site name.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"description": "Business or project category.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Primary intended audience.",
"minLength": 1
},
"offer": {
"type": "string",
"description": "Primary product, service, or proposition.",
"minLength": 1
},
"tone": {
"type": "string",
"description": "Desired writing and visual tone.",
"minLength": 1
},
"location": {
"type": "string",
"description": "Optional geographic market."
},
"differentiators": {
"type": "array",
"description": "Specific differentiators to communicate.",
"items": {
"type": "string",
"description": "One differentiator."
}
},
"goals": {
"type": "array",
"description": "Desired user and business outcomes.",
"items": {
"type": "string",
"description": "One goal."
}
},
"prompt": {
"type": "string",
"description": "Additional generation direction."
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"qualityIssue": {
"type": "object",
"description": "One actionable launch-quality finding.",
"properties": {
"id": {
"type": "string",
"description": "Stable issue code.",
"minLength": 1
},
"severity": {
"type": "string",
"description": "Issue severity.",
"enum": [
"info",
"warning",
"error"
]
},
"title": {
"type": "string",
"description": "Short issue title.",
"minLength": 1
},
"detail": {
"type": "string",
"description": "Actionable remediation detail.",
"minLength": 1
}
},
"required": [
"id",
"severity",
"title",
"detail"
],
"additionalProperties": false
},
"qualityReport": {
"type": "object",
"description": "Deterministic content and launch-quality report.",
"properties": {
"generatedAt": {
"type": "string",
"description": "ISO-8601 generation timestamp.",
"format": "date-time"
},
"score": {
"type": "number",
"description": "Quality score from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"description": "Actionable quality findings.",
"items": {
"$ref": "#/$defs/qualityIssue"
}
}
},
"required": [
"generatedAt",
"score",
"issues"
],
"additionalProperties": false
},
"siteRecord": {
"type": "object",
"description": "One TopoloWeb site and its current editable content.",
"properties": {
"id": {
"type": "string",
"description": "Stable site identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Platform hostname slug.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Internal site name.",
"minLength": 1
},
"status": {
"type": "string",
"description": "Current lifecycle status.",
"enum": [
"draft",
"published",
"archived"
]
},
"brief": {
"type": "object",
"description": "Generation brief retained for iterative edits.",
"additionalProperties": true
},
"draftContent": {
"$ref": "#/$defs/siteContent"
},
"currentVersionId": {
"type": "string",
"description": "Currently published immutable version identifier."
},
"draftPreviewToken": {
"type": "string",
"description": "Opaque token used by the draft preview URL.",
"minLength": 1
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"slug",
"name",
"status",
"brief",
"draftContent",
"draftPreviewToken",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteVersion": {
"type": "object",
"description": "One immutable published site version.",
"properties": {
"id": {
"type": "string",
"description": "Stable version identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"versionNumber": {
"type": "integer",
"description": "Monotonic site version number.",
"minimum": 1
},
"label": {
"type": "string",
"description": "Human-readable version label.",
"minLength": 1
},
"snapshot": {
"$ref": "#/$defs/siteContent"
},
"previewToken": {
"type": "string",
"description": "Opaque immutable-version preview token.",
"minLength": 1
},
"publishedAt": {
"type": "string",
"description": "ISO-8601 publication timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"versionNumber",
"label",
"snapshot",
"previewToken",
"publishedAt"
],
"additionalProperties": false
},
"siteDomain": {
"type": "object",
"description": "One platform or custom site domain.",
"properties": {
"id": {
"type": "string",
"description": "Stable domain identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"hostname": {
"type": "string",
"description": "Domain hostname without scheme.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Domain ownership kind.",
"enum": [
"platform",
"custom"
]
},
"status": {
"type": "string",
"description": "DNS and TLS activation status.",
"enum": [
"pending_dns",
"pending_ssl",
"active",
"failed"
]
},
"dnsTarget": {
"type": "string",
"description": "DNS target required for this domain.",
"minLength": 1
},
"verificationToken": {
"type": "string",
"description": "Opaque DNS ownership verification token.",
"minLength": 1
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the primary public hostname."
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"hostname",
"kind",
"status",
"dnsTarget",
"verificationToken",
"isPrimary",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteUrls": {
"type": "object",
"description": "Stable URLs used to preview and verify the site.",
"properties": {
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public site URL.",
"format": "uri"
}
},
"required": [
"previewUrl",
"publicUrl"
],
"additionalProperties": false
},
"siteDetails": {
"type": "object",
"description": "Complete editable site state returned after a build.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One site form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions"
],
"additionalProperties": false
}
}
},
"target": "api",
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "New site state, quality evidence, preview coordinates, and optional first published version.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
},
"version": {
"description": "First published version when publish=true; omitted otherwise.",
"anyOf": [
{
"$ref": "#/$defs/siteVersion"
},
{
"type": "null"
}
]
},
"urls": {
"$ref": "#/$defs/siteUrls"
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions",
"urls"
],
"additionalProperties": false,
"$defs": {
"jsonValue": {
"description": "A JSON-compatible component property value.",
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/jsonValue"
}
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
}
]
},
"actionLink": {
"type": "object",
"description": "A rendered call-to-action link.",
"properties": {
"label": {
"type": "string",
"description": "Visible link label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, mailto, tel, or HTTPS URL.",
"minLength": 1
},
"linkKind": {
"type": "string",
"description": "Whether the link targets a TopoloWeb page or a custom URL.",
"enum": [
"custom",
"page"
]
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"label",
"href"
],
"additionalProperties": false
},
"navigationItem": {
"type": "object",
"description": "One site navigation entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable navigation item identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Visible navigation label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, or external URL.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Navigation emphasis.",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"description": "Optional parent item identifier for one-level menus."
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
},
"navigationMenu": {
"type": "object",
"description": "A named reusable navigation menu.",
"properties": {
"id": {
"type": "string",
"description": "Stable menu identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable menu name.",
"minLength": 1
},
"placement": {
"type": "string",
"description": "Custom menu placement marker.",
"const": "custom"
},
"items": {
"type": "array",
"description": "Ordered menu entries.",
"items": {
"$ref": "#/$defs/navigationItem"
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
},
"pageStyleDefaultsBase": {
"type": "object",
"description": "Site-wide default layout and typography values.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
}
},
"additionalProperties": false
},
"pageStyleDefaults": {
"type": "object",
"description": "Desktop page defaults with optional viewport overrides.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
},
"responsive": {
"type": "object",
"description": "Viewport-specific page-default overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/pageStyleDefaultsBase"
}
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"description": "Complete TopoloWeb theme and responsive page defaults.",
"properties": {
"primary": {
"type": "string",
"description": "Primary brand color.",
"minLength": 1
},
"secondary": {
"type": "string",
"description": "Secondary brand color.",
"minLength": 1
},
"surface": {
"type": "string",
"description": "Primary surface color.",
"minLength": 1
},
"ink": {
"type": "string",
"description": "Primary text color.",
"minLength": 1
},
"muted": {
"type": "string",
"description": "Muted text color.",
"minLength": 1
},
"accent": {
"type": "string",
"description": "Accent color.",
"minLength": 1
},
"accentSoft": {
"type": "string",
"description": "Soft accent surface color.",
"minLength": 1
},
"glow": {
"type": "string",
"description": "Decorative glow color.",
"minLength": 1
},
"headingFont": {
"type": "string",
"description": "CSS heading font stack.",
"minLength": 1
},
"bodyFont": {
"type": "string",
"description": "CSS body font stack.",
"minLength": 1
},
"radius": {
"type": "string",
"description": "Default CSS corner radius.",
"minLength": 1
},
"brandLogoUrl": {
"type": "string",
"description": "HTTPS brand-logo URL."
},
"brandLogoAlt": {
"type": "string",
"description": "Accessible brand-logo description."
},
"brandLogoWidth": {
"type": "string",
"description": "CSS brand-logo width."
},
"brandLogoHeight": {
"type": "string",
"description": "CSS brand-logo height."
},
"pageDefaults": {
"$ref": "#/$defs/pageStyleDefaults"
},
"customCss": {
"type": "string",
"description": "Reviewed site-wide CSS loaded after generated styles."
}
},
"required": [
"primary",
"secondary",
"surface",
"ink",
"muted",
"accent",
"accentSoft",
"glow",
"headingFont",
"bodyFont",
"radius"
],
"additionalProperties": false
},
"sectionStyleBase": {
"type": "object",
"description": "Desktop section style values.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
}
},
"additionalProperties": false
},
"sectionStyle": {
"type": "object",
"description": "Section style values with optional responsive overrides.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
},
"responsive": {
"type": "object",
"description": "Viewport-specific section-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItemStyleBase": {
"type": "object",
"description": "Desktop repeated-item style values.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
}
},
"additionalProperties": false
},
"sectionItemStyle": {
"type": "object",
"description": "Repeated-item style values with optional responsive overrides.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
},
"responsive": {
"type": "object",
"description": "Viewport-specific item-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionItemStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItem": {
"type": "object",
"description": "One repeated card, row, quote, metric, question, or media item.",
"properties": {
"id": {
"type": "string",
"description": "Stable item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title."
},
"body": {
"type": "string",
"description": "Visible supporting copy."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional value or price."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
},
"styleClassIds": {
"type": "array",
"description": "Reusable item style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"sectionValue": {
"type": "object",
"description": "Renderer-backed block content without persisted child arrays.",
"properties": {
"id": {
"type": "string",
"description": "Stable section identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"eyebrow": {
"type": "string",
"description": "Optional eyebrow copy."
},
"title": {
"type": "string",
"description": "Visible section heading."
},
"body": {
"type": "string",
"description": "Visible section body copy."
},
"kicker": {
"type": "string",
"description": "Optional supporting kicker."
},
"primaryAction": {
"$ref": "#/$defs/actionLink"
},
"secondaryAction": {
"$ref": "#/$defs/actionLink"
},
"imageUrl": {
"type": "string",
"description": "Optional section image URL."
},
"alt": {
"type": "string",
"description": "Accessible section-image description."
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"styleClassIds": {
"type": "array",
"description": "Reusable section style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
},
"style": {
"$ref": "#/$defs/sectionStyle"
},
"formId": {
"type": "string",
"description": "Form identifier for a contact-form block."
},
"collectionSlug": {
"type": "string",
"description": "Collection slug bound to this block."
},
"collectionLimit": {
"type": "number",
"description": "Maximum collection entries rendered.",
"minimum": 1
},
"collectionSort": {
"type": "string",
"description": "Collection sorting behavior.",
"enum": [
"manual",
"title_asc",
"title_desc",
"meta_asc",
"meta_desc"
]
},
"html": {
"type": "string",
"description": "Reviewed HTML for embed-capable blocks."
},
"videoUrl": {
"type": "string",
"description": "Direct, YouTube, or Vimeo video URL."
},
"videoProvider": {
"type": "string",
"description": "Video provider.",
"enum": [
"direct",
"youtube",
"vimeo"
]
},
"videoPosterUrl": {
"type": "string",
"description": "Video poster image URL."
},
"videoAutoplay": {
"type": "boolean",
"description": "Autoplay video when allowed."
},
"videoControls": {
"type": "boolean",
"description": "Show native video controls."
},
"videoMuted": {
"type": "boolean",
"description": "Mute video playback."
},
"componentName": {
"type": "string",
"description": "Approved custom component name."
},
"componentProps": {
"type": "object",
"description": "Component-specific reviewed JSON properties.",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
},
"menuId": {
"type": "string",
"description": "Reusable menu identifier bound to a menu block."
}
},
"required": [
"id",
"kind",
"title",
"body"
],
"additionalProperties": false
},
"pageValue": {
"type": "object",
"description": "Persisted page metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable page identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Root-relative page slug beginning with /.",
"pattern": "^/"
},
"title": {
"type": "string",
"description": "Visible page heading and title-template input.",
"minLength": 1
},
"description": {
"type": "string",
"description": "Page search and social description."
}
},
"required": [
"id",
"slug",
"title",
"description"
],
"additionalProperties": false
},
"columnValue": {
"type": "object",
"description": "Persisted layout-column metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable column identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional editor label."
},
"span": {
"type": "number",
"description": "Grid span.",
"minimum": 1
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Original product-domain identity for a document node.",
"properties": {
"kind": {
"type": "string",
"description": "Source record kind.",
"enum": [
"page",
"section",
"column",
"item"
]
},
"id": {
"type": "string",
"description": "Source record identifier.",
"minLength": 1
}
},
"required": [
"kind",
"id"
],
"additionalProperties": false
},
"pageNode": {
"type": "object",
"description": "A canonical page node owning exactly one page-body slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "page"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Parent node identifier when nested."
},
"source": {
"$ref": "#/$defs/source"
},
"value": {
"$ref": "#/$defs/pageValue"
},
"children": {
"type": "array",
"description": "Exactly one page-body slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"value",
"children"
],
"additionalProperties": false
},
"slotNode": {
"type": "object",
"description": "A canonical child slot controlling accepted node kinds.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "slot"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning page, layout, or block node identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"slotKind": {
"type": "string",
"description": "Child-slot role.",
"enum": [
"page-body",
"layout-column",
"block-items"
]
},
"accepts": {
"type": "array",
"description": "Document node kinds allowed in this slot.",
"items": {
"type": "string",
"description": "One allowed node kind.",
"enum": [
"layout",
"block",
"item"
]
}
},
"parentSectionId": {
"type": "string",
"description": "Owning section identifier for layout and block slots."
},
"columnId": {
"type": "string",
"description": "Column identifier for layout-column slots."
},
"value": {
"$ref": "#/$defs/columnValue"
},
"children": {
"type": "array",
"description": "Canonical child nodes.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"slotKind",
"accepts",
"children"
],
"additionalProperties": false
},
"layoutNode": {
"type": "object",
"description": "A canonical layout block owning one or more layout-column slots.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "layout"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"layoutKind": {
"type": "string",
"description": "Layout behavior.",
"enum": [
"container",
"grid",
"stack",
"flex-row",
"columns"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Layout-column slots.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"layoutKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"blockNode": {
"type": "object",
"description": "A canonical renderer block with optional block-items slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "block"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"blockKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Optional block-items slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"blockKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"itemNode": {
"type": "object",
"description": "A canonical repeated-item leaf node.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "item"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning block-items slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"parentSectionId": {
"type": "string",
"description": "Owning block section identifier.",
"minLength": 1
},
"itemId": {
"type": "string",
"description": "Persisted item identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionItem"
},
"children": {
"type": "array",
"description": "Item nodes are leaves and must have no children.",
"maxItems": 0
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"parentSectionId",
"itemId",
"value",
"children"
],
"additionalProperties": false
},
"siteDocumentNode": {
"description": "One canonical TopoloWeb document node.",
"oneOf": [
{
"$ref": "#/$defs/pageNode"
},
{
"$ref": "#/$defs/slotNode"
},
{
"$ref": "#/$defs/layoutNode"
},
{
"$ref": "#/$defs/blockNode"
},
{
"$ref": "#/$defs/itemNode"
}
]
},
"siteDocument": {
"type": "object",
"description": "Canonical versioned TopoloWeb document tree.",
"properties": {
"version": {
"type": "integer",
"description": "Document schema version.",
"const": 1
},
"pages": {
"type": "array",
"description": "Canonical page nodes.",
"items": {
"$ref": "#/$defs/pageNode"
}
}
},
"required": [
"version",
"pages"
],
"additionalProperties": false
},
"styleClass": {
"description": "A reusable section or item style class.",
"oneOf": [
{
"type": "object",
"description": "Reusable section style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "section"
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Reusable repeated-item style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "item"
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
},
"collectionItem": {
"type": "object",
"description": "One reusable CMS collection entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection-item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title.",
"minLength": 1
},
"body": {
"type": "string",
"description": "Visible item body."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional price or value."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"collection": {
"type": "object",
"description": "Reusable CMS collection.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Stable collection slug.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Collection content kind.",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"description": "Human-readable collection label.",
"minLength": 1
},
"items": {
"type": "array",
"description": "Ordered collection entries.",
"items": {
"$ref": "#/$defs/collectionItem"
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
},
"codeSnippet": {
"type": "object",
"description": "Reviewed bounded code injection.",
"properties": {
"id": {
"type": "string",
"description": "Stable snippet identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable snippet label.",
"minLength": 1
},
"slot": {
"type": "string",
"description": "Injection slot.",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string",
"description": "Reviewed HTML, CSS, or JavaScript source."
},
"enabled": {
"type": "boolean",
"description": "Whether this snippet is active."
}
},
"required": [
"id",
"label",
"slot",
"code",
"enabled"
],
"additionalProperties": false
},
"seo": {
"type": "object",
"description": "Site-wide search and social metadata defaults.",
"properties": {
"titleTemplate": {
"type": "string",
"description": "Title template; %s is replaced by the page title."
},
"metaTitle": {
"type": "string",
"description": "Default page title override."
},
"metaDescription": {
"type": "string",
"description": "Default search and social description."
},
"faviconUrl": {
"type": "string",
"description": "Browser and bookmark icon URL."
},
"openGraphImageUrl": {
"type": "string",
"description": "Default Open Graph image URL."
},
"canonicalUrl": {
"type": "string",
"description": "Canonical site URL."
}
},
"additionalProperties": false
},
"siteContent": {
"type": "object",
"description": "Complete canonical TopoloWeb site content.",
"properties": {
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"siteTitle": {
"type": "string",
"description": "Public site title.",
"minLength": 1
},
"siteDescription": {
"type": "string",
"description": "Public site description."
},
"contactEmail": {
"type": "string",
"description": "Public contact email.",
"minLength": 1
},
"contactPhone": {
"type": "string",
"description": "Optional public contact phone number."
},
"navigation": {
"type": "array",
"description": "Primary site navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"footerNavigation": {
"type": "array",
"description": "Footer navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"menus": {
"type": "array",
"description": "Reusable custom menus.",
"items": {
"$ref": "#/$defs/navigationMenu"
}
},
"styleClasses": {
"type": "array",
"description": "Reusable section and item styles.",
"items": {
"$ref": "#/$defs/styleClass"
}
},
"theme": {
"$ref": "#/$defs/theme"
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"description": "Reusable CMS collections.",
"items": {
"$ref": "#/$defs/collection"
}
},
"codeSnippets": {
"type": "array",
"description": "Reviewed bounded code snippets.",
"items": {
"$ref": "#/$defs/codeSnippet"
}
},
"seo": {
"$ref": "#/$defs/seo"
}
},
"required": [
"intent",
"siteTitle",
"siteDescription",
"contactEmail",
"navigation",
"footerNavigation",
"menus",
"styleClasses",
"theme",
"document",
"collections",
"codeSnippets"
],
"additionalProperties": false
},
"createSite": {
"type": "object",
"description": "Brief used to create a new TopoloWeb site.",
"properties": {
"name": {
"type": "string",
"description": "Internal and initial public site name.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"description": "Business or project category.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Primary intended audience.",
"minLength": 1
},
"offer": {
"type": "string",
"description": "Primary product, service, or proposition.",
"minLength": 1
},
"tone": {
"type": "string",
"description": "Desired writing and visual tone.",
"minLength": 1
},
"location": {
"type": "string",
"description": "Optional geographic market."
},
"differentiators": {
"type": "array",
"description": "Specific differentiators to communicate.",
"items": {
"type": "string",
"description": "One differentiator."
}
},
"goals": {
"type": "array",
"description": "Desired user and business outcomes.",
"items": {
"type": "string",
"description": "One goal."
}
},
"prompt": {
"type": "string",
"description": "Additional generation direction."
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"qualityIssue": {
"type": "object",
"description": "One actionable launch-quality finding.",
"properties": {
"id": {
"type": "string",
"description": "Stable issue code.",
"minLength": 1
},
"severity": {
"type": "string",
"description": "Issue severity.",
"enum": [
"info",
"warning",
"error"
]
},
"title": {
"type": "string",
"description": "Short issue title.",
"minLength": 1
},
"detail": {
"type": "string",
"description": "Actionable remediation detail.",
"minLength": 1
}
},
"required": [
"id",
"severity",
"title",
"detail"
],
"additionalProperties": false
},
"qualityReport": {
"type": "object",
"description": "Deterministic content and launch-quality report.",
"properties": {
"generatedAt": {
"type": "string",
"description": "ISO-8601 generation timestamp.",
"format": "date-time"
},
"score": {
"type": "number",
"description": "Quality score from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"description": "Actionable quality findings.",
"items": {
"$ref": "#/$defs/qualityIssue"
}
}
},
"required": [
"generatedAt",
"score",
"issues"
],
"additionalProperties": false
},
"siteRecord": {
"type": "object",
"description": "One TopoloWeb site and its current editable content.",
"properties": {
"id": {
"type": "string",
"description": "Stable site identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Platform hostname slug.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Internal site name.",
"minLength": 1
},
"status": {
"type": "string",
"description": "Current lifecycle status.",
"enum": [
"draft",
"published",
"archived"
]
},
"brief": {
"type": "object",
"description": "Generation brief retained for iterative edits.",
"additionalProperties": true
},
"draftContent": {
"$ref": "#/$defs/siteContent"
},
"currentVersionId": {
"type": "string",
"description": "Currently published immutable version identifier."
},
"draftPreviewToken": {
"type": "string",
"description": "Opaque token used by the draft preview URL.",
"minLength": 1
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"slug",
"name",
"status",
"brief",
"draftContent",
"draftPreviewToken",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteVersion": {
"type": "object",
"description": "One immutable published site version.",
"properties": {
"id": {
"type": "string",
"description": "Stable version identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"versionNumber": {
"type": "integer",
"description": "Monotonic site version number.",
"minimum": 1
},
"label": {
"type": "string",
"description": "Human-readable version label.",
"minLength": 1
},
"snapshot": {
"$ref": "#/$defs/siteContent"
},
"previewToken": {
"type": "string",
"description": "Opaque immutable-version preview token.",
"minLength": 1
},
"publishedAt": {
"type": "string",
"description": "ISO-8601 publication timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"versionNumber",
"label",
"snapshot",
"previewToken",
"publishedAt"
],
"additionalProperties": false
},
"siteDomain": {
"type": "object",
"description": "One platform or custom site domain.",
"properties": {
"id": {
"type": "string",
"description": "Stable domain identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"hostname": {
"type": "string",
"description": "Domain hostname without scheme.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Domain ownership kind.",
"enum": [
"platform",
"custom"
]
},
"status": {
"type": "string",
"description": "DNS and TLS activation status.",
"enum": [
"pending_dns",
"pending_ssl",
"active",
"failed"
]
},
"dnsTarget": {
"type": "string",
"description": "DNS target required for this domain.",
"minLength": 1
},
"verificationToken": {
"type": "string",
"description": "Opaque DNS ownership verification token.",
"minLength": 1
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the primary public hostname."
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"hostname",
"kind",
"status",
"dnsTarget",
"verificationToken",
"isPrimary",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteUrls": {
"type": "object",
"description": "Stable URLs used to preview and verify the site.",
"properties": {
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public site URL.",
"format": "uri"
}
},
"required": [
"previewUrl",
"publicUrl"
],
"additionalProperties": false
},
"siteDetails": {
"type": "object",
"description": "Complete editable site state returned after a build.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One site form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions"
],
"additionalProperties": false
}
}
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/web",
"resource": {
"kind": "site",
"idPath": "site.id",
"versionPath": "version.id"
},
"effects": [
"Creates one site and draft content.",
"Publishes only when publish=true."
],
"errors": [
{
"status": 400,
"code": "invalid_site_payload",
"recovery": "Correct the payload using sites.capabilities.get, then call sites.validate."
},
{
"status": 422,
"code": "publish_blocked",
"recovery": "Resolve every error in qualityReport before publishing."
}
],
"verify": [
"Open urls.previewUrl at every required viewport.",
"When published, open urls.publicUrl and confirm the intended version."
],
"rollbackActionId": "app_topolo_web.sites.versions.restore",
"nextActionIds": [
"app_topolo_web.sites.preview.get",
"app_topolo_web.sites.publish.preflight"
]
},
"authorizationMode": "static",
"documentation": {
"example_input": {
"site": {
"name": "example",
"businessType": "example",
"audience": "example",
"offer": "example",
"tone": "example"
},
"content": {
"intent": "business_site",
"siteTitle": "example",
"siteDescription": "example",
"contactEmail": "user@example.com",
"navigation": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"href": "example",
"kind": "primary"
}
],
"footerNavigation": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"href": "example",
"kind": "primary"
}
],
"menus": [
{
"id": "00000000-0000-4000-8000-000000000000",
"name": "example",
"placement": "custom",
"items": []
}
],
"styleClasses": [
{
"id": "00000000-0000-4000-8000-000000000000",
"name": "example",
"targetKind": "container",
"targetScope": "section",
"style": {
"backgroundColor": "example",
"backgroundImageUrl": "https://example.com",
"backgroundMode": "cover"
}
}
],
"theme": {
"primary": "example",
"secondary": "example",
"surface": "example",
"ink": "example",
"muted": "example",
"accent": "example",
"accentSoft": "example",
"glow": "example",
"headingFont": "example",
"bodyFont": "example",
"radius": "example"
},
"document": {
"version": 1,
"pages": []
},
"collections": [
{
"id": "00000000-0000-4000-8000-000000000000",
"slug": "example",
"kind": "apps",
"label": "example",
"items": []
}
],
"codeSnippets": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"slot": "head",
"code": "example",
"enabled": true
}
]
}
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/build",
"body": {
"site": {
"name": "example",
"businessType": "example",
"audience": "example",
"offer": "example",
"tone": "example"
},
"content": {
"intent": "business_site",
"siteTitle": "example",
"siteDescription": "example",
"contactEmail": "user@example.com",
"navigation": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"href": "example",
"kind": "primary"
}
],
"footerNavigation": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"href": "example",
"kind": "primary"
}
],
"menus": [
{
"id": "00000000-0000-4000-8000-000000000000",
"name": "example",
"placement": "custom",
"items": []
}
],
"styleClasses": [
{
"id": "00000000-0000-4000-8000-000000000000",
"name": "example",
"targetKind": "container",
"targetScope": "section",
"style": {
"backgroundColor": "example",
"backgroundImageUrl": "https://example.com",
"backgroundMode": "cover"
}
}
],
"theme": {
"primary": "example",
"secondary": "example",
"surface": "example",
"ink": "example",
"muted": "example",
"accent": "example",
"accentSoft": "example",
"glow": "example",
"headingFont": "example",
"bodyFont": "example",
"radius": "example"
},
"document": {
"version": 1,
"pages": []
},
"collections": [
{
"id": "00000000-0000-4000-8000-000000000000",
"slug": "example",
"kind": "apps",
"label": "example",
"items": []
}
],
"codeSnippets": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"slot": "head",
"code": "example",
"enabled": true
}
]
}
}
},
"effects": "Creates one site and draft content. Publishes only when publish=true.",
"verification": [
"Open urls.previewUrl at every required viewport.",
"When published, open urls.publicUrl and confirm the intended version."
],
"recovery": [
"400 invalid_site_payload: Correct the payload using sites.capabilities.get, then call sites.validate.",
"422 publish_blocked: Resolve every error in qualityReport before publishing."
],
"docs_url": "https://docs.topolo.app/applications/web",
"resource": {
"kind": "site",
"idPath": "site.id",
"versionPath": "version.id"
},
"next_action_ids": [
"app_topolo_web.sites.preview.get",
"app_topolo_web.sites.publish.preflight"
],
"rollback_action_id": "app_topolo_web.sites.versions.restore"
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/build",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.capabilities.get",
"title": "Get site agent capabilities",
"description": "Get the canonical repository-independent site schema, block catalog, examples, viewports, and workflow.",
"permission": "studio:read",
"method": "GET",
"path": "/api/studio/sites/capabilities",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "TopoloWeb clean-room agent capabilities and canonical schemas.",
"properties": {
"contractVersion": {
"type": "string",
"description": "Version of the public agent contract.",
"minLength": 1
},
"docsUrl": {
"type": "string",
"description": "Public operational documentation URL.",
"format": "uri"
},
"siteContentSchema": {
"type": "object",
"description": "Canonical SiteContent JSON Schema.",
"additionalProperties": true
},
"buildInputSchema": {
"type": "object",
"description": "sites.build input JSON Schema.",
"additionalProperties": true
},
"blockCatalog": {
"type": "array",
"description": "Renderer-backed block catalog with fields and design capabilities.",
"items": {
"type": "object",
"description": "One block capability entry.",
"additionalProperties": true
}
},
"compositionRecipes": {
"type": "array",
"description": "Audience-specific composition plans that use the block catalog deliberately.",
"items": {
"type": "object",
"description": "One complete composition recipe.",
"properties": {
"id": {
"type": "string",
"description": "Stable recipe identifier.",
"enum": [
"angel-investor",
"marketplace-developer",
"partner-channel",
"platform-pitch",
"venture-investor"
]
},
"title": {
"type": "string",
"description": "Human-readable recipe title.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Audience the composition is designed to persuade.",
"minLength": 1
},
"visualThesis": {
"type": "string",
"description": "Unifying visual direction for the site.",
"minLength": 1
},
"contentPlan": {
"type": "array",
"description": "Ordered content and block plan.",
"items": {
"type": "object",
"description": "One block choice and its narrative job.",
"properties": {
"purpose": {
"type": "string",
"description": "Narrative purpose of the block.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"itemsPlacement": {
"type": "string",
"description": "Optional repeated-item placement.",
"enum": [
"left",
"right"
]
},
"note": {
"type": "string",
"description": "Implementation guidance for this block.",
"minLength": 1
}
},
"required": [
"purpose",
"kind",
"note"
],
"additionalProperties": false
}
},
"interactionThesis": {
"type": "array",
"description": "Interaction and reading-flow principles.",
"items": {
"type": "string",
"description": "One interaction principle.",
"minLength": 1
}
},
"avoid": {
"type": "array",
"description": "Composition failure modes to avoid.",
"items": {
"type": "string",
"description": "One failure mode.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"audience",
"visualThesis",
"contentPlan",
"interactionThesis",
"avoid"
],
"additionalProperties": false
}
},
"viewports": {
"type": "array",
"description": "Required responsive QA viewports.",
"items": {
"type": "object",
"description": "One required QA viewport.",
"properties": {
"id": {
"type": "string",
"description": "Viewport identifier.",
"enum": [
"mobile",
"tablet",
"desktop",
"4k"
]
},
"width": {
"type": "integer",
"description": "Viewport width in CSS pixels.",
"minimum": 1
},
"description": {
"type": "string",
"description": "What this viewport verifies.",
"minLength": 1
}
},
"required": [
"id",
"width",
"description"
],
"additionalProperties": false
}
},
"workflow": {
"type": "array",
"description": "Ordered clean-room build workflow.",
"items": {
"type": "string",
"description": "One workflow step.",
"minLength": 1
}
},
"examples": {
"type": "array",
"description": "Canonical generated examples for every supported site intent.",
"items": {
"type": "object",
"description": "One named intent example.",
"properties": {
"id": {
"type": "string",
"description": "Stable example identifier.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"content": {
"$ref": "#/$defs/siteContent"
}
},
"required": [
"id",
"intent",
"content"
],
"additionalProperties": false
}
}
},
"required": [
"contractVersion",
"docsUrl",
"siteContentSchema",
"buildInputSchema",
"blockCatalog",
"compositionRecipes",
"viewports",
"workflow",
"examples"
],
"additionalProperties": false,
"$defs": {
"jsonValue": {
"description": "A JSON-compatible component property value.",
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/jsonValue"
}
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
}
]
},
"actionLink": {
"type": "object",
"description": "A rendered call-to-action link.",
"properties": {
"label": {
"type": "string",
"description": "Visible link label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, mailto, tel, or HTTPS URL.",
"minLength": 1
},
"linkKind": {
"type": "string",
"description": "Whether the link targets a TopoloWeb page or a custom URL.",
"enum": [
"custom",
"page"
]
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"label",
"href"
],
"additionalProperties": false
},
"navigationItem": {
"type": "object",
"description": "One site navigation entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable navigation item identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Visible navigation label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, or external URL.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Navigation emphasis.",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"description": "Optional parent item identifier for one-level menus."
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
},
"navigationMenu": {
"type": "object",
"description": "A named reusable navigation menu.",
"properties": {
"id": {
"type": "string",
"description": "Stable menu identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable menu name.",
"minLength": 1
},
"placement": {
"type": "string",
"description": "Custom menu placement marker.",
"const": "custom"
},
"items": {
"type": "array",
"description": "Ordered menu entries.",
"items": {
"$ref": "#/$defs/navigationItem"
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
},
"pageStyleDefaultsBase": {
"type": "object",
"description": "Site-wide default layout and typography values.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
}
},
"additionalProperties": false
},
"pageStyleDefaults": {
"type": "object",
"description": "Desktop page defaults with optional viewport overrides.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
},
"responsive": {
"type": "object",
"description": "Viewport-specific page-default overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/pageStyleDefaultsBase"
}
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"description": "Complete TopoloWeb theme and responsive page defaults.",
"properties": {
"primary": {
"type": "string",
"description": "Primary brand color.",
"minLength": 1
},
"secondary": {
"type": "string",
"description": "Secondary brand color.",
"minLength": 1
},
"surface": {
"type": "string",
"description": "Primary surface color.",
"minLength": 1
},
"ink": {
"type": "string",
"description": "Primary text color.",
"minLength": 1
},
"muted": {
"type": "string",
"description": "Muted text color.",
"minLength": 1
},
"accent": {
"type": "string",
"description": "Accent color.",
"minLength": 1
},
"accentSoft": {
"type": "string",
"description": "Soft accent surface color.",
"minLength": 1
},
"glow": {
"type": "string",
"description": "Decorative glow color.",
"minLength": 1
},
"headingFont": {
"type": "string",
"description": "CSS heading font stack.",
"minLength": 1
},
"bodyFont": {
"type": "string",
"description": "CSS body font stack.",
"minLength": 1
},
"radius": {
"type": "string",
"description": "Default CSS corner radius.",
"minLength": 1
},
"brandLogoUrl": {
"type": "string",
"description": "HTTPS brand-logo URL."
},
"brandLogoAlt": {
"type": "string",
"description": "Accessible brand-logo description."
},
"brandLogoWidth": {
"type": "string",
"description": "CSS brand-logo width."
},
"brandLogoHeight": {
"type": "string",
"description": "CSS brand-logo height."
},
"pageDefaults": {
"$ref": "#/$defs/pageStyleDefaults"
},
"customCss": {
"type": "string",
"description": "Reviewed site-wide CSS loaded after generated styles."
}
},
"required": [
"primary",
"secondary",
"surface",
"ink",
"muted",
"accent",
"accentSoft",
"glow",
"headingFont",
"bodyFont",
"radius"
],
"additionalProperties": false
},
"sectionStyleBase": {
"type": "object",
"description": "Desktop section style values.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
}
},
"additionalProperties": false
},
"sectionStyle": {
"type": "object",
"description": "Section style values with optional responsive overrides.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
},
"responsive": {
"type": "object",
"description": "Viewport-specific section-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItemStyleBase": {
"type": "object",
"description": "Desktop repeated-item style values.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
}
},
"additionalProperties": false
},
"sectionItemStyle": {
"type": "object",
"description": "Repeated-item style values with optional responsive overrides.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
},
"responsive": {
"type": "object",
"description": "Viewport-specific item-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionItemStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItem": {
"type": "object",
"description": "One repeated card, row, quote, metric, question, or media item.",
"properties": {
"id": {
"type": "string",
"description": "Stable item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title."
},
"body": {
"type": "string",
"description": "Visible supporting copy."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional value or price."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
},
"styleClassIds": {
"type": "array",
"description": "Reusable item style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"sectionValue": {
"type": "object",
"description": "Renderer-backed block content without persisted child arrays.",
"properties": {
"id": {
"type": "string",
"description": "Stable section identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"eyebrow": {
"type": "string",
"description": "Optional eyebrow copy."
},
"title": {
"type": "string",
"description": "Visible section heading."
},
"body": {
"type": "string",
"description": "Visible section body copy."
},
"kicker": {
"type": "string",
"description": "Optional supporting kicker."
},
"primaryAction": {
"$ref": "#/$defs/actionLink"
},
"secondaryAction": {
"$ref": "#/$defs/actionLink"
},
"imageUrl": {
"type": "string",
"description": "Optional section image URL."
},
"alt": {
"type": "string",
"description": "Accessible section-image description."
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"styleClassIds": {
"type": "array",
"description": "Reusable section style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
},
"style": {
"$ref": "#/$defs/sectionStyle"
},
"formId": {
"type": "string",
"description": "Form identifier for a contact-form block."
},
"collectionSlug": {
"type": "string",
"description": "Collection slug bound to this block."
},
"collectionLimit": {
"type": "number",
"description": "Maximum collection entries rendered.",
"minimum": 1
},
"collectionSort": {
"type": "string",
"description": "Collection sorting behavior.",
"enum": [
"manual",
"title_asc",
"title_desc",
"meta_asc",
"meta_desc"
]
},
"html": {
"type": "string",
"description": "Reviewed HTML for embed-capable blocks."
},
"videoUrl": {
"type": "string",
"description": "Direct, YouTube, or Vimeo video URL."
},
"videoProvider": {
"type": "string",
"description": "Video provider.",
"enum": [
"direct",
"youtube",
"vimeo"
]
},
"videoPosterUrl": {
"type": "string",
"description": "Video poster image URL."
},
"videoAutoplay": {
"type": "boolean",
"description": "Autoplay video when allowed."
},
"videoControls": {
"type": "boolean",
"description": "Show native video controls."
},
"videoMuted": {
"type": "boolean",
"description": "Mute video playback."
},
"componentName": {
"type": "string",
"description": "Approved custom component name."
},
"componentProps": {
"type": "object",
"description": "Component-specific reviewed JSON properties.",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
},
"menuId": {
"type": "string",
"description": "Reusable menu identifier bound to a menu block."
}
},
"required": [
"id",
"kind",
"title",
"body"
],
"additionalProperties": false
},
"pageValue": {
"type": "object",
"description": "Persisted page metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable page identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Root-relative page slug beginning with /.",
"pattern": "^/"
},
"title": {
"type": "string",
"description": "Visible page heading and title-template input.",
"minLength": 1
},
"description": {
"type": "string",
"description": "Page search and social description."
}
},
"required": [
"id",
"slug",
"title",
"description"
],
"additionalProperties": false
},
"columnValue": {
"type": "object",
"description": "Persisted layout-column metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable column identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional editor label."
},
"span": {
"type": "number",
"description": "Grid span.",
"minimum": 1
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Original product-domain identity for a document node.",
"properties": {
"kind": {
"type": "string",
"description": "Source record kind.",
"enum": [
"page",
"section",
"column",
"item"
]
},
"id": {
"type": "string",
"description": "Source record identifier.",
"minLength": 1
}
},
"required": [
"kind",
"id"
],
"additionalProperties": false
},
"pageNode": {
"type": "object",
"description": "A canonical page node owning exactly one page-body slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "page"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Parent node identifier when nested."
},
"source": {
"$ref": "#/$defs/source"
},
"value": {
"$ref": "#/$defs/pageValue"
},
"children": {
"type": "array",
"description": "Exactly one page-body slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"value",
"children"
],
"additionalProperties": false
},
"slotNode": {
"type": "object",
"description": "A canonical child slot controlling accepted node kinds.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "slot"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning page, layout, or block node identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"slotKind": {
"type": "string",
"description": "Child-slot role.",
"enum": [
"page-body",
"layout-column",
"block-items"
]
},
"accepts": {
"type": "array",
"description": "Document node kinds allowed in this slot.",
"items": {
"type": "string",
"description": "One allowed node kind.",
"enum": [
"layout",
"block",
"item"
]
}
},
"parentSectionId": {
"type": "string",
"description": "Owning section identifier for layout and block slots."
},
"columnId": {
"type": "string",
"description": "Column identifier for layout-column slots."
},
"value": {
"$ref": "#/$defs/columnValue"
},
"children": {
"type": "array",
"description": "Canonical child nodes.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"slotKind",
"accepts",
"children"
],
"additionalProperties": false
},
"layoutNode": {
"type": "object",
"description": "A canonical layout block owning one or more layout-column slots.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "layout"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"layoutKind": {
"type": "string",
"description": "Layout behavior.",
"enum": [
"container",
"grid",
"stack",
"flex-row",
"columns"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Layout-column slots.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"layoutKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"blockNode": {
"type": "object",
"description": "A canonical renderer block with optional block-items slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "block"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"blockKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Optional block-items slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"blockKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"itemNode": {
"type": "object",
"description": "A canonical repeated-item leaf node.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "item"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning block-items slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"parentSectionId": {
"type": "string",
"description": "Owning block section identifier.",
"minLength": 1
},
"itemId": {
"type": "string",
"description": "Persisted item identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionItem"
},
"children": {
"type": "array",
"description": "Item nodes are leaves and must have no children.",
"maxItems": 0
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"parentSectionId",
"itemId",
"value",
"children"
],
"additionalProperties": false
},
"siteDocumentNode": {
"description": "One canonical TopoloWeb document node.",
"oneOf": [
{
"$ref": "#/$defs/pageNode"
},
{
"$ref": "#/$defs/slotNode"
},
{
"$ref": "#/$defs/layoutNode"
},
{
"$ref": "#/$defs/blockNode"
},
{
"$ref": "#/$defs/itemNode"
}
]
},
"siteDocument": {
"type": "object",
"description": "Canonical versioned TopoloWeb document tree.",
"properties": {
"version": {
"type": "integer",
"description": "Document schema version.",
"const": 1
},
"pages": {
"type": "array",
"description": "Canonical page nodes.",
"items": {
"$ref": "#/$defs/pageNode"
}
}
},
"required": [
"version",
"pages"
],
"additionalProperties": false
},
"styleClass": {
"description": "A reusable section or item style class.",
"oneOf": [
{
"type": "object",
"description": "Reusable section style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "section"
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Reusable repeated-item style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "item"
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
},
"collectionItem": {
"type": "object",
"description": "One reusable CMS collection entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection-item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title.",
"minLength": 1
},
"body": {
"type": "string",
"description": "Visible item body."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional price or value."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"collection": {
"type": "object",
"description": "Reusable CMS collection.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Stable collection slug.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Collection content kind.",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"description": "Human-readable collection label.",
"minLength": 1
},
"items": {
"type": "array",
"description": "Ordered collection entries.",
"items": {
"$ref": "#/$defs/collectionItem"
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
},
"codeSnippet": {
"type": "object",
"description": "Reviewed bounded code injection.",
"properties": {
"id": {
"type": "string",
"description": "Stable snippet identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable snippet label.",
"minLength": 1
},
"slot": {
"type": "string",
"description": "Injection slot.",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string",
"description": "Reviewed HTML, CSS, or JavaScript source."
},
"enabled": {
"type": "boolean",
"description": "Whether this snippet is active."
}
},
"required": [
"id",
"label",
"slot",
"code",
"enabled"
],
"additionalProperties": false
},
"seo": {
"type": "object",
"description": "Site-wide search and social metadata defaults.",
"properties": {
"titleTemplate": {
"type": "string",
"description": "Title template; %s is replaced by the page title."
},
"metaTitle": {
"type": "string",
"description": "Default page title override."
},
"metaDescription": {
"type": "string",
"description": "Default search and social description."
},
"faviconUrl": {
"type": "string",
"description": "Browser and bookmark icon URL."
},
"openGraphImageUrl": {
"type": "string",
"description": "Default Open Graph image URL."
},
"canonicalUrl": {
"type": "string",
"description": "Canonical site URL."
}
},
"additionalProperties": false
},
"siteContent": {
"type": "object",
"description": "Complete canonical TopoloWeb site content.",
"properties": {
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"siteTitle": {
"type": "string",
"description": "Public site title.",
"minLength": 1
},
"siteDescription": {
"type": "string",
"description": "Public site description."
},
"contactEmail": {
"type": "string",
"description": "Public contact email.",
"minLength": 1
},
"contactPhone": {
"type": "string",
"description": "Optional public contact phone number."
},
"navigation": {
"type": "array",
"description": "Primary site navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"footerNavigation": {
"type": "array",
"description": "Footer navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"menus": {
"type": "array",
"description": "Reusable custom menus.",
"items": {
"$ref": "#/$defs/navigationMenu"
}
},
"styleClasses": {
"type": "array",
"description": "Reusable section and item styles.",
"items": {
"$ref": "#/$defs/styleClass"
}
},
"theme": {
"$ref": "#/$defs/theme"
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"description": "Reusable CMS collections.",
"items": {
"$ref": "#/$defs/collection"
}
},
"codeSnippets": {
"type": "array",
"description": "Reviewed bounded code snippets.",
"items": {
"$ref": "#/$defs/codeSnippet"
}
},
"seo": {
"$ref": "#/$defs/seo"
}
},
"required": [
"intent",
"siteTitle",
"siteDescription",
"contactEmail",
"navigation",
"footerNavigation",
"menus",
"styleClasses",
"theme",
"document",
"collections",
"codeSnippets"
],
"additionalProperties": false
},
"createSite": {
"type": "object",
"description": "Brief used to create a new TopoloWeb site.",
"properties": {
"name": {
"type": "string",
"description": "Internal and initial public site name.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"description": "Business or project category.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Primary intended audience.",
"minLength": 1
},
"offer": {
"type": "string",
"description": "Primary product, service, or proposition.",
"minLength": 1
},
"tone": {
"type": "string",
"description": "Desired writing and visual tone.",
"minLength": 1
},
"location": {
"type": "string",
"description": "Optional geographic market."
},
"differentiators": {
"type": "array",
"description": "Specific differentiators to communicate.",
"items": {
"type": "string",
"description": "One differentiator."
}
},
"goals": {
"type": "array",
"description": "Desired user and business outcomes.",
"items": {
"type": "string",
"description": "One goal."
}
},
"prompt": {
"type": "string",
"description": "Additional generation direction."
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"qualityIssue": {
"type": "object",
"description": "One actionable launch-quality finding.",
"properties": {
"id": {
"type": "string",
"description": "Stable issue code.",
"minLength": 1
},
"severity": {
"type": "string",
"description": "Issue severity.",
"enum": [
"info",
"warning",
"error"
]
},
"title": {
"type": "string",
"description": "Short issue title.",
"minLength": 1
},
"detail": {
"type": "string",
"description": "Actionable remediation detail.",
"minLength": 1
}
},
"required": [
"id",
"severity",
"title",
"detail"
],
"additionalProperties": false
},
"qualityReport": {
"type": "object",
"description": "Deterministic content and launch-quality report.",
"properties": {
"generatedAt": {
"type": "string",
"description": "ISO-8601 generation timestamp.",
"format": "date-time"
},
"score": {
"type": "number",
"description": "Quality score from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"description": "Actionable quality findings.",
"items": {
"$ref": "#/$defs/qualityIssue"
}
}
},
"required": [
"generatedAt",
"score",
"issues"
],
"additionalProperties": false
},
"siteRecord": {
"type": "object",
"description": "One TopoloWeb site and its current editable content.",
"properties": {
"id": {
"type": "string",
"description": "Stable site identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Platform hostname slug.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Internal site name.",
"minLength": 1
},
"status": {
"type": "string",
"description": "Current lifecycle status.",
"enum": [
"draft",
"published",
"archived"
]
},
"brief": {
"type": "object",
"description": "Generation brief retained for iterative edits.",
"additionalProperties": true
},
"draftContent": {
"$ref": "#/$defs/siteContent"
},
"currentVersionId": {
"type": "string",
"description": "Currently published immutable version identifier."
},
"draftPreviewToken": {
"type": "string",
"description": "Opaque token used by the draft preview URL.",
"minLength": 1
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"slug",
"name",
"status",
"brief",
"draftContent",
"draftPreviewToken",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteVersion": {
"type": "object",
"description": "One immutable published site version.",
"properties": {
"id": {
"type": "string",
"description": "Stable version identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"versionNumber": {
"type": "integer",
"description": "Monotonic site version number.",
"minimum": 1
},
"label": {
"type": "string",
"description": "Human-readable version label.",
"minLength": 1
},
"snapshot": {
"$ref": "#/$defs/siteContent"
},
"previewToken": {
"type": "string",
"description": "Opaque immutable-version preview token.",
"minLength": 1
},
"publishedAt": {
"type": "string",
"description": "ISO-8601 publication timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"versionNumber",
"label",
"snapshot",
"previewToken",
"publishedAt"
],
"additionalProperties": false
},
"siteDomain": {
"type": "object",
"description": "One platform or custom site domain.",
"properties": {
"id": {
"type": "string",
"description": "Stable domain identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"hostname": {
"type": "string",
"description": "Domain hostname without scheme.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Domain ownership kind.",
"enum": [
"platform",
"custom"
]
},
"status": {
"type": "string",
"description": "DNS and TLS activation status.",
"enum": [
"pending_dns",
"pending_ssl",
"active",
"failed"
]
},
"dnsTarget": {
"type": "string",
"description": "DNS target required for this domain.",
"minLength": 1
},
"verificationToken": {
"type": "string",
"description": "Opaque DNS ownership verification token.",
"minLength": 1
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the primary public hostname."
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"hostname",
"kind",
"status",
"dnsTarget",
"verificationToken",
"isPrimary",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteUrls": {
"type": "object",
"description": "Stable URLs used to preview and verify the site.",
"properties": {
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public site URL.",
"format": "uri"
}
},
"required": [
"previewUrl",
"publicUrl"
],
"additionalProperties": false
},
"siteDetails": {
"type": "object",
"description": "Complete editable site state returned after a build.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One site form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions"
],
"additionalProperties": false
}
}
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/capabilities",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/capabilities without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/capabilities",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.validate",
"title": "Validate canonical site payload",
"description": "Validate complete site content and return deterministic quality findings without persisting changes.",
"permission": "studio:read",
"method": "POST",
"path": "/api/studio/sites/validate",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Validate TopoloWeb site",
"type": "object",
"description": "Validate a complete canonical site payload without persisting it.",
"properties": {
"site": {
"$ref": "#/$defs/createSite"
},
"content": {
"$ref": "#/$defs/siteContent"
}
},
"required": [
"site",
"content"
],
"additionalProperties": false,
"$defs": {
"jsonValue": {
"description": "A JSON-compatible component property value.",
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/jsonValue"
}
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
}
]
},
"actionLink": {
"type": "object",
"description": "A rendered call-to-action link.",
"properties": {
"label": {
"type": "string",
"description": "Visible link label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, mailto, tel, or HTTPS URL.",
"minLength": 1
},
"linkKind": {
"type": "string",
"description": "Whether the link targets a TopoloWeb page or a custom URL.",
"enum": [
"custom",
"page"
]
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"label",
"href"
],
"additionalProperties": false
},
"navigationItem": {
"type": "object",
"description": "One site navigation entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable navigation item identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Visible navigation label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, or external URL.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Navigation emphasis.",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"description": "Optional parent item identifier for one-level menus."
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
},
"navigationMenu": {
"type": "object",
"description": "A named reusable navigation menu.",
"properties": {
"id": {
"type": "string",
"description": "Stable menu identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable menu name.",
"minLength": 1
},
"placement": {
"type": "string",
"description": "Custom menu placement marker.",
"const": "custom"
},
"items": {
"type": "array",
"description": "Ordered menu entries.",
"items": {
"$ref": "#/$defs/navigationItem"
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
},
"pageStyleDefaultsBase": {
"type": "object",
"description": "Site-wide default layout and typography values.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
}
},
"additionalProperties": false
},
"pageStyleDefaults": {
"type": "object",
"description": "Desktop page defaults with optional viewport overrides.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
},
"responsive": {
"type": "object",
"description": "Viewport-specific page-default overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/pageStyleDefaultsBase"
}
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"description": "Complete TopoloWeb theme and responsive page defaults.",
"properties": {
"primary": {
"type": "string",
"description": "Primary brand color.",
"minLength": 1
},
"secondary": {
"type": "string",
"description": "Secondary brand color.",
"minLength": 1
},
"surface": {
"type": "string",
"description": "Primary surface color.",
"minLength": 1
},
"ink": {
"type": "string",
"description": "Primary text color.",
"minLength": 1
},
"muted": {
"type": "string",
"description": "Muted text color.",
"minLength": 1
},
"accent": {
"type": "string",
"description": "Accent color.",
"minLength": 1
},
"accentSoft": {
"type": "string",
"description": "Soft accent surface color.",
"minLength": 1
},
"glow": {
"type": "string",
"description": "Decorative glow color.",
"minLength": 1
},
"headingFont": {
"type": "string",
"description": "CSS heading font stack.",
"minLength": 1
},
"bodyFont": {
"type": "string",
"description": "CSS body font stack.",
"minLength": 1
},
"radius": {
"type": "string",
"description": "Default CSS corner radius.",
"minLength": 1
},
"brandLogoUrl": {
"type": "string",
"description": "HTTPS brand-logo URL."
},
"brandLogoAlt": {
"type": "string",
"description": "Accessible brand-logo description."
},
"brandLogoWidth": {
"type": "string",
"description": "CSS brand-logo width."
},
"brandLogoHeight": {
"type": "string",
"description": "CSS brand-logo height."
},
"pageDefaults": {
"$ref": "#/$defs/pageStyleDefaults"
},
"customCss": {
"type": "string",
"description": "Reviewed site-wide CSS loaded after generated styles."
}
},
"required": [
"primary",
"secondary",
"surface",
"ink",
"muted",
"accent",
"accentSoft",
"glow",
"headingFont",
"bodyFont",
"radius"
],
"additionalProperties": false
},
"sectionStyleBase": {
"type": "object",
"description": "Desktop section style values.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
}
},
"additionalProperties": false
},
"sectionStyle": {
"type": "object",
"description": "Section style values with optional responsive overrides.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
},
"responsive": {
"type": "object",
"description": "Viewport-specific section-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItemStyleBase": {
"type": "object",
"description": "Desktop repeated-item style values.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
}
},
"additionalProperties": false
},
"sectionItemStyle": {
"type": "object",
"description": "Repeated-item style values with optional responsive overrides.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
},
"responsive": {
"type": "object",
"description": "Viewport-specific item-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionItemStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItem": {
"type": "object",
"description": "One repeated card, row, quote, metric, question, or media item.",
"properties": {
"id": {
"type": "string",
"description": "Stable item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title."
},
"body": {
"type": "string",
"description": "Visible supporting copy."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional value or price."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
},
"styleClassIds": {
"type": "array",
"description": "Reusable item style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"sectionValue": {
"type": "object",
"description": "Renderer-backed block content without persisted child arrays.",
"properties": {
"id": {
"type": "string",
"description": "Stable section identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"eyebrow": {
"type": "string",
"description": "Optional eyebrow copy."
},
"title": {
"type": "string",
"description": "Visible section heading."
},
"body": {
"type": "string",
"description": "Visible section body copy."
},
"kicker": {
"type": "string",
"description": "Optional supporting kicker."
},
"primaryAction": {
"$ref": "#/$defs/actionLink"
},
"secondaryAction": {
"$ref": "#/$defs/actionLink"
},
"imageUrl": {
"type": "string",
"description": "Optional section image URL."
},
"alt": {
"type": "string",
"description": "Accessible section-image description."
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"styleClassIds": {
"type": "array",
"description": "Reusable section style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
},
"style": {
"$ref": "#/$defs/sectionStyle"
},
"formId": {
"type": "string",
"description": "Form identifier for a contact-form block."
},
"collectionSlug": {
"type": "string",
"description": "Collection slug bound to this block."
},
"collectionLimit": {
"type": "number",
"description": "Maximum collection entries rendered.",
"minimum": 1
},
"collectionSort": {
"type": "string",
"description": "Collection sorting behavior.",
"enum": [
"manual",
"title_asc",
"title_desc",
"meta_asc",
"meta_desc"
]
},
"html": {
"type": "string",
"description": "Reviewed HTML for embed-capable blocks."
},
"videoUrl": {
"type": "string",
"description": "Direct, YouTube, or Vimeo video URL."
},
"videoProvider": {
"type": "string",
"description": "Video provider.",
"enum": [
"direct",
"youtube",
"vimeo"
]
},
"videoPosterUrl": {
"type": "string",
"description": "Video poster image URL."
},
"videoAutoplay": {
"type": "boolean",
"description": "Autoplay video when allowed."
},
"videoControls": {
"type": "boolean",
"description": "Show native video controls."
},
"videoMuted": {
"type": "boolean",
"description": "Mute video playback."
},
"componentName": {
"type": "string",
"description": "Approved custom component name."
},
"componentProps": {
"type": "object",
"description": "Component-specific reviewed JSON properties.",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
},
"menuId": {
"type": "string",
"description": "Reusable menu identifier bound to a menu block."
}
},
"required": [
"id",
"kind",
"title",
"body"
],
"additionalProperties": false
},
"pageValue": {
"type": "object",
"description": "Persisted page metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable page identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Root-relative page slug beginning with /.",
"pattern": "^/"
},
"title": {
"type": "string",
"description": "Visible page heading and title-template input.",
"minLength": 1
},
"description": {
"type": "string",
"description": "Page search and social description."
}
},
"required": [
"id",
"slug",
"title",
"description"
],
"additionalProperties": false
},
"columnValue": {
"type": "object",
"description": "Persisted layout-column metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable column identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional editor label."
},
"span": {
"type": "number",
"description": "Grid span.",
"minimum": 1
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Original product-domain identity for a document node.",
"properties": {
"kind": {
"type": "string",
"description": "Source record kind.",
"enum": [
"page",
"section",
"column",
"item"
]
},
"id": {
"type": "string",
"description": "Source record identifier.",
"minLength": 1
}
},
"required": [
"kind",
"id"
],
"additionalProperties": false
},
"pageNode": {
"type": "object",
"description": "A canonical page node owning exactly one page-body slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "page"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Parent node identifier when nested."
},
"source": {
"$ref": "#/$defs/source"
},
"value": {
"$ref": "#/$defs/pageValue"
},
"children": {
"type": "array",
"description": "Exactly one page-body slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"value",
"children"
],
"additionalProperties": false
},
"slotNode": {
"type": "object",
"description": "A canonical child slot controlling accepted node kinds.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "slot"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning page, layout, or block node identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"slotKind": {
"type": "string",
"description": "Child-slot role.",
"enum": [
"page-body",
"layout-column",
"block-items"
]
},
"accepts": {
"type": "array",
"description": "Document node kinds allowed in this slot.",
"items": {
"type": "string",
"description": "One allowed node kind.",
"enum": [
"layout",
"block",
"item"
]
}
},
"parentSectionId": {
"type": "string",
"description": "Owning section identifier for layout and block slots."
},
"columnId": {
"type": "string",
"description": "Column identifier for layout-column slots."
},
"value": {
"$ref": "#/$defs/columnValue"
},
"children": {
"type": "array",
"description": "Canonical child nodes.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"slotKind",
"accepts",
"children"
],
"additionalProperties": false
},
"layoutNode": {
"type": "object",
"description": "A canonical layout block owning one or more layout-column slots.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "layout"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"layoutKind": {
"type": "string",
"description": "Layout behavior.",
"enum": [
"container",
"grid",
"stack",
"flex-row",
"columns"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Layout-column slots.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"layoutKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"blockNode": {
"type": "object",
"description": "A canonical renderer block with optional block-items slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "block"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"blockKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Optional block-items slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"blockKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"itemNode": {
"type": "object",
"description": "A canonical repeated-item leaf node.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "item"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning block-items slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"parentSectionId": {
"type": "string",
"description": "Owning block section identifier.",
"minLength": 1
},
"itemId": {
"type": "string",
"description": "Persisted item identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionItem"
},
"children": {
"type": "array",
"description": "Item nodes are leaves and must have no children.",
"maxItems": 0
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"parentSectionId",
"itemId",
"value",
"children"
],
"additionalProperties": false
},
"siteDocumentNode": {
"description": "One canonical TopoloWeb document node.",
"oneOf": [
{
"$ref": "#/$defs/pageNode"
},
{
"$ref": "#/$defs/slotNode"
},
{
"$ref": "#/$defs/layoutNode"
},
{
"$ref": "#/$defs/blockNode"
},
{
"$ref": "#/$defs/itemNode"
}
]
},
"siteDocument": {
"type": "object",
"description": "Canonical versioned TopoloWeb document tree.",
"properties": {
"version": {
"type": "integer",
"description": "Document schema version.",
"const": 1
},
"pages": {
"type": "array",
"description": "Canonical page nodes.",
"items": {
"$ref": "#/$defs/pageNode"
}
}
},
"required": [
"version",
"pages"
],
"additionalProperties": false
},
"styleClass": {
"description": "A reusable section or item style class.",
"oneOf": [
{
"type": "object",
"description": "Reusable section style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "section"
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Reusable repeated-item style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "item"
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
},
"collectionItem": {
"type": "object",
"description": "One reusable CMS collection entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection-item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title.",
"minLength": 1
},
"body": {
"type": "string",
"description": "Visible item body."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional price or value."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"collection": {
"type": "object",
"description": "Reusable CMS collection.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Stable collection slug.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Collection content kind.",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"description": "Human-readable collection label.",
"minLength": 1
},
"items": {
"type": "array",
"description": "Ordered collection entries.",
"items": {
"$ref": "#/$defs/collectionItem"
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
},
"codeSnippet": {
"type": "object",
"description": "Reviewed bounded code injection.",
"properties": {
"id": {
"type": "string",
"description": "Stable snippet identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable snippet label.",
"minLength": 1
},
"slot": {
"type": "string",
"description": "Injection slot.",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string",
"description": "Reviewed HTML, CSS, or JavaScript source."
},
"enabled": {
"type": "boolean",
"description": "Whether this snippet is active."
}
},
"required": [
"id",
"label",
"slot",
"code",
"enabled"
],
"additionalProperties": false
},
"seo": {
"type": "object",
"description": "Site-wide search and social metadata defaults.",
"properties": {
"titleTemplate": {
"type": "string",
"description": "Title template; %s is replaced by the page title."
},
"metaTitle": {
"type": "string",
"description": "Default page title override."
},
"metaDescription": {
"type": "string",
"description": "Default search and social description."
},
"faviconUrl": {
"type": "string",
"description": "Browser and bookmark icon URL."
},
"openGraphImageUrl": {
"type": "string",
"description": "Default Open Graph image URL."
},
"canonicalUrl": {
"type": "string",
"description": "Canonical site URL."
}
},
"additionalProperties": false
},
"siteContent": {
"type": "object",
"description": "Complete canonical TopoloWeb site content.",
"properties": {
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"siteTitle": {
"type": "string",
"description": "Public site title.",
"minLength": 1
},
"siteDescription": {
"type": "string",
"description": "Public site description."
},
"contactEmail": {
"type": "string",
"description": "Public contact email.",
"minLength": 1
},
"contactPhone": {
"type": "string",
"description": "Optional public contact phone number."
},
"navigation": {
"type": "array",
"description": "Primary site navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"footerNavigation": {
"type": "array",
"description": "Footer navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"menus": {
"type": "array",
"description": "Reusable custom menus.",
"items": {
"$ref": "#/$defs/navigationMenu"
}
},
"styleClasses": {
"type": "array",
"description": "Reusable section and item styles.",
"items": {
"$ref": "#/$defs/styleClass"
}
},
"theme": {
"$ref": "#/$defs/theme"
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"description": "Reusable CMS collections.",
"items": {
"$ref": "#/$defs/collection"
}
},
"codeSnippets": {
"type": "array",
"description": "Reviewed bounded code snippets.",
"items": {
"$ref": "#/$defs/codeSnippet"
}
},
"seo": {
"$ref": "#/$defs/seo"
}
},
"required": [
"intent",
"siteTitle",
"siteDescription",
"contactEmail",
"navigation",
"footerNavigation",
"menus",
"styleClasses",
"theme",
"document",
"collections",
"codeSnippets"
],
"additionalProperties": false
},
"createSite": {
"type": "object",
"description": "Brief used to create a new TopoloWeb site.",
"properties": {
"name": {
"type": "string",
"description": "Internal and initial public site name.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"description": "Business or project category.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Primary intended audience.",
"minLength": 1
},
"offer": {
"type": "string",
"description": "Primary product, service, or proposition.",
"minLength": 1
},
"tone": {
"type": "string",
"description": "Desired writing and visual tone.",
"minLength": 1
},
"location": {
"type": "string",
"description": "Optional geographic market."
},
"differentiators": {
"type": "array",
"description": "Specific differentiators to communicate.",
"items": {
"type": "string",
"description": "One differentiator."
}
},
"goals": {
"type": "array",
"description": "Desired user and business outcomes.",
"items": {
"type": "string",
"description": "One goal."
}
},
"prompt": {
"type": "string",
"description": "Additional generation direction."
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"qualityIssue": {
"type": "object",
"description": "One actionable launch-quality finding.",
"properties": {
"id": {
"type": "string",
"description": "Stable issue code.",
"minLength": 1
},
"severity": {
"type": "string",
"description": "Issue severity.",
"enum": [
"info",
"warning",
"error"
]
},
"title": {
"type": "string",
"description": "Short issue title.",
"minLength": 1
},
"detail": {
"type": "string",
"description": "Actionable remediation detail.",
"minLength": 1
}
},
"required": [
"id",
"severity",
"title",
"detail"
],
"additionalProperties": false
},
"qualityReport": {
"type": "object",
"description": "Deterministic content and launch-quality report.",
"properties": {
"generatedAt": {
"type": "string",
"description": "ISO-8601 generation timestamp.",
"format": "date-time"
},
"score": {
"type": "number",
"description": "Quality score from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"description": "Actionable quality findings.",
"items": {
"$ref": "#/$defs/qualityIssue"
}
}
},
"required": [
"generatedAt",
"score",
"issues"
],
"additionalProperties": false
},
"siteRecord": {
"type": "object",
"description": "One TopoloWeb site and its current editable content.",
"properties": {
"id": {
"type": "string",
"description": "Stable site identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Platform hostname slug.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Internal site name.",
"minLength": 1
},
"status": {
"type": "string",
"description": "Current lifecycle status.",
"enum": [
"draft",
"published",
"archived"
]
},
"brief": {
"type": "object",
"description": "Generation brief retained for iterative edits.",
"additionalProperties": true
},
"draftContent": {
"$ref": "#/$defs/siteContent"
},
"currentVersionId": {
"type": "string",
"description": "Currently published immutable version identifier."
},
"draftPreviewToken": {
"type": "string",
"description": "Opaque token used by the draft preview URL.",
"minLength": 1
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"slug",
"name",
"status",
"brief",
"draftContent",
"draftPreviewToken",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteVersion": {
"type": "object",
"description": "One immutable published site version.",
"properties": {
"id": {
"type": "string",
"description": "Stable version identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"versionNumber": {
"type": "integer",
"description": "Monotonic site version number.",
"minimum": 1
},
"label": {
"type": "string",
"description": "Human-readable version label.",
"minLength": 1
},
"snapshot": {
"$ref": "#/$defs/siteContent"
},
"previewToken": {
"type": "string",
"description": "Opaque immutable-version preview token.",
"minLength": 1
},
"publishedAt": {
"type": "string",
"description": "ISO-8601 publication timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"versionNumber",
"label",
"snapshot",
"previewToken",
"publishedAt"
],
"additionalProperties": false
},
"siteDomain": {
"type": "object",
"description": "One platform or custom site domain.",
"properties": {
"id": {
"type": "string",
"description": "Stable domain identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"hostname": {
"type": "string",
"description": "Domain hostname without scheme.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Domain ownership kind.",
"enum": [
"platform",
"custom"
]
},
"status": {
"type": "string",
"description": "DNS and TLS activation status.",
"enum": [
"pending_dns",
"pending_ssl",
"active",
"failed"
]
},
"dnsTarget": {
"type": "string",
"description": "DNS target required for this domain.",
"minLength": 1
},
"verificationToken": {
"type": "string",
"description": "Opaque DNS ownership verification token.",
"minLength": 1
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the primary public hostname."
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"hostname",
"kind",
"status",
"dnsTarget",
"verificationToken",
"isPrimary",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteUrls": {
"type": "object",
"description": "Stable URLs used to preview and verify the site.",
"properties": {
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public site URL.",
"format": "uri"
}
},
"required": [
"previewUrl",
"publicUrl"
],
"additionalProperties": false
},
"siteDetails": {
"type": "object",
"description": "Complete editable site state returned after a build.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One site form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions"
],
"additionalProperties": false
}
}
},
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Non-persisting TopoloWeb validation result.",
"properties": {
"valid": {
"type": "boolean",
"description": "Whether the payload is structurally valid and has no blocking quality issues."
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
}
},
"required": [
"valid",
"qualityReport"
],
"additionalProperties": false,
"$defs": {
"jsonValue": {
"description": "A JSON-compatible component property value.",
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/jsonValue"
}
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
}
]
},
"actionLink": {
"type": "object",
"description": "A rendered call-to-action link.",
"properties": {
"label": {
"type": "string",
"description": "Visible link label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, mailto, tel, or HTTPS URL.",
"minLength": 1
},
"linkKind": {
"type": "string",
"description": "Whether the link targets a TopoloWeb page or a custom URL.",
"enum": [
"custom",
"page"
]
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"label",
"href"
],
"additionalProperties": false
},
"navigationItem": {
"type": "object",
"description": "One site navigation entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable navigation item identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Visible navigation label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, or external URL.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Navigation emphasis.",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"description": "Optional parent item identifier for one-level menus."
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
},
"navigationMenu": {
"type": "object",
"description": "A named reusable navigation menu.",
"properties": {
"id": {
"type": "string",
"description": "Stable menu identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable menu name.",
"minLength": 1
},
"placement": {
"type": "string",
"description": "Custom menu placement marker.",
"const": "custom"
},
"items": {
"type": "array",
"description": "Ordered menu entries.",
"items": {
"$ref": "#/$defs/navigationItem"
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
},
"pageStyleDefaultsBase": {
"type": "object",
"description": "Site-wide default layout and typography values.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
}
},
"additionalProperties": false
},
"pageStyleDefaults": {
"type": "object",
"description": "Desktop page defaults with optional viewport overrides.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
},
"responsive": {
"type": "object",
"description": "Viewport-specific page-default overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/pageStyleDefaultsBase"
}
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"description": "Complete TopoloWeb theme and responsive page defaults.",
"properties": {
"primary": {
"type": "string",
"description": "Primary brand color.",
"minLength": 1
},
"secondary": {
"type": "string",
"description": "Secondary brand color.",
"minLength": 1
},
"surface": {
"type": "string",
"description": "Primary surface color.",
"minLength": 1
},
"ink": {
"type": "string",
"description": "Primary text color.",
"minLength": 1
},
"muted": {
"type": "string",
"description": "Muted text color.",
"minLength": 1
},
"accent": {
"type": "string",
"description": "Accent color.",
"minLength": 1
},
"accentSoft": {
"type": "string",
"description": "Soft accent surface color.",
"minLength": 1
},
"glow": {
"type": "string",
"description": "Decorative glow color.",
"minLength": 1
},
"headingFont": {
"type": "string",
"description": "CSS heading font stack.",
"minLength": 1
},
"bodyFont": {
"type": "string",
"description": "CSS body font stack.",
"minLength": 1
},
"radius": {
"type": "string",
"description": "Default CSS corner radius.",
"minLength": 1
},
"brandLogoUrl": {
"type": "string",
"description": "HTTPS brand-logo URL."
},
"brandLogoAlt": {
"type": "string",
"description": "Accessible brand-logo description."
},
"brandLogoWidth": {
"type": "string",
"description": "CSS brand-logo width."
},
"brandLogoHeight": {
"type": "string",
"description": "CSS brand-logo height."
},
"pageDefaults": {
"$ref": "#/$defs/pageStyleDefaults"
},
"customCss": {
"type": "string",
"description": "Reviewed site-wide CSS loaded after generated styles."
}
},
"required": [
"primary",
"secondary",
"surface",
"ink",
"muted",
"accent",
"accentSoft",
"glow",
"headingFont",
"bodyFont",
"radius"
],
"additionalProperties": false
},
"sectionStyleBase": {
"type": "object",
"description": "Desktop section style values.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
}
},
"additionalProperties": false
},
"sectionStyle": {
"type": "object",
"description": "Section style values with optional responsive overrides.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
},
"responsive": {
"type": "object",
"description": "Viewport-specific section-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItemStyleBase": {
"type": "object",
"description": "Desktop repeated-item style values.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
}
},
"additionalProperties": false
},
"sectionItemStyle": {
"type": "object",
"description": "Repeated-item style values with optional responsive overrides.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
},
"responsive": {
"type": "object",
"description": "Viewport-specific item-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionItemStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItem": {
"type": "object",
"description": "One repeated card, row, quote, metric, question, or media item.",
"properties": {
"id": {
"type": "string",
"description": "Stable item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title."
},
"body": {
"type": "string",
"description": "Visible supporting copy."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional value or price."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
},
"styleClassIds": {
"type": "array",
"description": "Reusable item style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"sectionValue": {
"type": "object",
"description": "Renderer-backed block content without persisted child arrays.",
"properties": {
"id": {
"type": "string",
"description": "Stable section identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"eyebrow": {
"type": "string",
"description": "Optional eyebrow copy."
},
"title": {
"type": "string",
"description": "Visible section heading."
},
"body": {
"type": "string",
"description": "Visible section body copy."
},
"kicker": {
"type": "string",
"description": "Optional supporting kicker."
},
"primaryAction": {
"$ref": "#/$defs/actionLink"
},
"secondaryAction": {
"$ref": "#/$defs/actionLink"
},
"imageUrl": {
"type": "string",
"description": "Optional section image URL."
},
"alt": {
"type": "string",
"description": "Accessible section-image description."
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"styleClassIds": {
"type": "array",
"description": "Reusable section style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
},
"style": {
"$ref": "#/$defs/sectionStyle"
},
"formId": {
"type": "string",
"description": "Form identifier for a contact-form block."
},
"collectionSlug": {
"type": "string",
"description": "Collection slug bound to this block."
},
"collectionLimit": {
"type": "number",
"description": "Maximum collection entries rendered.",
"minimum": 1
},
"collectionSort": {
"type": "string",
"description": "Collection sorting behavior.",
"enum": [
"manual",
"title_asc",
"title_desc",
"meta_asc",
"meta_desc"
]
},
"html": {
"type": "string",
"description": "Reviewed HTML for embed-capable blocks."
},
"videoUrl": {
"type": "string",
"description": "Direct, YouTube, or Vimeo video URL."
},
"videoProvider": {
"type": "string",
"description": "Video provider.",
"enum": [
"direct",
"youtube",
"vimeo"
]
},
"videoPosterUrl": {
"type": "string",
"description": "Video poster image URL."
},
"videoAutoplay": {
"type": "boolean",
"description": "Autoplay video when allowed."
},
"videoControls": {
"type": "boolean",
"description": "Show native video controls."
},
"videoMuted": {
"type": "boolean",
"description": "Mute video playback."
},
"componentName": {
"type": "string",
"description": "Approved custom component name."
},
"componentProps": {
"type": "object",
"description": "Component-specific reviewed JSON properties.",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
},
"menuId": {
"type": "string",
"description": "Reusable menu identifier bound to a menu block."
}
},
"required": [
"id",
"kind",
"title",
"body"
],
"additionalProperties": false
},
"pageValue": {
"type": "object",
"description": "Persisted page metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable page identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Root-relative page slug beginning with /.",
"pattern": "^/"
},
"title": {
"type": "string",
"description": "Visible page heading and title-template input.",
"minLength": 1
},
"description": {
"type": "string",
"description": "Page search and social description."
}
},
"required": [
"id",
"slug",
"title",
"description"
],
"additionalProperties": false
},
"columnValue": {
"type": "object",
"description": "Persisted layout-column metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable column identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional editor label."
},
"span": {
"type": "number",
"description": "Grid span.",
"minimum": 1
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Original product-domain identity for a document node.",
"properties": {
"kind": {
"type": "string",
"description": "Source record kind.",
"enum": [
"page",
"section",
"column",
"item"
]
},
"id": {
"type": "string",
"description": "Source record identifier.",
"minLength": 1
}
},
"required": [
"kind",
"id"
],
"additionalProperties": false
},
"pageNode": {
"type": "object",
"description": "A canonical page node owning exactly one page-body slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "page"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Parent node identifier when nested."
},
"source": {
"$ref": "#/$defs/source"
},
"value": {
"$ref": "#/$defs/pageValue"
},
"children": {
"type": "array",
"description": "Exactly one page-body slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"value",
"children"
],
"additionalProperties": false
},
"slotNode": {
"type": "object",
"description": "A canonical child slot controlling accepted node kinds.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "slot"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning page, layout, or block node identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"slotKind": {
"type": "string",
"description": "Child-slot role.",
"enum": [
"page-body",
"layout-column",
"block-items"
]
},
"accepts": {
"type": "array",
"description": "Document node kinds allowed in this slot.",
"items": {
"type": "string",
"description": "One allowed node kind.",
"enum": [
"layout",
"block",
"item"
]
}
},
"parentSectionId": {
"type": "string",
"description": "Owning section identifier for layout and block slots."
},
"columnId": {
"type": "string",
"description": "Column identifier for layout-column slots."
},
"value": {
"$ref": "#/$defs/columnValue"
},
"children": {
"type": "array",
"description": "Canonical child nodes.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"slotKind",
"accepts",
"children"
],
"additionalProperties": false
},
"layoutNode": {
"type": "object",
"description": "A canonical layout block owning one or more layout-column slots.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "layout"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"layoutKind": {
"type": "string",
"description": "Layout behavior.",
"enum": [
"container",
"grid",
"stack",
"flex-row",
"columns"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Layout-column slots.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"layoutKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"blockNode": {
"type": "object",
"description": "A canonical renderer block with optional block-items slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "block"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"blockKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Optional block-items slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"blockKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"itemNode": {
"type": "object",
"description": "A canonical repeated-item leaf node.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "item"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning block-items slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"parentSectionId": {
"type": "string",
"description": "Owning block section identifier.",
"minLength": 1
},
"itemId": {
"type": "string",
"description": "Persisted item identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionItem"
},
"children": {
"type": "array",
"description": "Item nodes are leaves and must have no children.",
"maxItems": 0
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"parentSectionId",
"itemId",
"value",
"children"
],
"additionalProperties": false
},
"siteDocumentNode": {
"description": "One canonical TopoloWeb document node.",
"oneOf": [
{
"$ref": "#/$defs/pageNode"
},
{
"$ref": "#/$defs/slotNode"
},
{
"$ref": "#/$defs/layoutNode"
},
{
"$ref": "#/$defs/blockNode"
},
{
"$ref": "#/$defs/itemNode"
}
]
},
"siteDocument": {
"type": "object",
"description": "Canonical versioned TopoloWeb document tree.",
"properties": {
"version": {
"type": "integer",
"description": "Document schema version.",
"const": 1
},
"pages": {
"type": "array",
"description": "Canonical page nodes.",
"items": {
"$ref": "#/$defs/pageNode"
}
}
},
"required": [
"version",
"pages"
],
"additionalProperties": false
},
"styleClass": {
"description": "A reusable section or item style class.",
"oneOf": [
{
"type": "object",
"description": "Reusable section style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "section"
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Reusable repeated-item style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "item"
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
},
"collectionItem": {
"type": "object",
"description": "One reusable CMS collection entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection-item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title.",
"minLength": 1
},
"body": {
"type": "string",
"description": "Visible item body."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional price or value."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"collection": {
"type": "object",
"description": "Reusable CMS collection.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Stable collection slug.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Collection content kind.",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"description": "Human-readable collection label.",
"minLength": 1
},
"items": {
"type": "array",
"description": "Ordered collection entries.",
"items": {
"$ref": "#/$defs/collectionItem"
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
},
"codeSnippet": {
"type": "object",
"description": "Reviewed bounded code injection.",
"properties": {
"id": {
"type": "string",
"description": "Stable snippet identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable snippet label.",
"minLength": 1
},
"slot": {
"type": "string",
"description": "Injection slot.",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string",
"description": "Reviewed HTML, CSS, or JavaScript source."
},
"enabled": {
"type": "boolean",
"description": "Whether this snippet is active."
}
},
"required": [
"id",
"label",
"slot",
"code",
"enabled"
],
"additionalProperties": false
},
"seo": {
"type": "object",
"description": "Site-wide search and social metadata defaults.",
"properties": {
"titleTemplate": {
"type": "string",
"description": "Title template; %s is replaced by the page title."
},
"metaTitle": {
"type": "string",
"description": "Default page title override."
},
"metaDescription": {
"type": "string",
"description": "Default search and social description."
},
"faviconUrl": {
"type": "string",
"description": "Browser and bookmark icon URL."
},
"openGraphImageUrl": {
"type": "string",
"description": "Default Open Graph image URL."
},
"canonicalUrl": {
"type": "string",
"description": "Canonical site URL."
}
},
"additionalProperties": false
},
"siteContent": {
"type": "object",
"description": "Complete canonical TopoloWeb site content.",
"properties": {
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"siteTitle": {
"type": "string",
"description": "Public site title.",
"minLength": 1
},
"siteDescription": {
"type": "string",
"description": "Public site description."
},
"contactEmail": {
"type": "string",
"description": "Public contact email.",
"minLength": 1
},
"contactPhone": {
"type": "string",
"description": "Optional public contact phone number."
},
"navigation": {
"type": "array",
"description": "Primary site navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"footerNavigation": {
"type": "array",
"description": "Footer navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"menus": {
"type": "array",
"description": "Reusable custom menus.",
"items": {
"$ref": "#/$defs/navigationMenu"
}
},
"styleClasses": {
"type": "array",
"description": "Reusable section and item styles.",
"items": {
"$ref": "#/$defs/styleClass"
}
},
"theme": {
"$ref": "#/$defs/theme"
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"description": "Reusable CMS collections.",
"items": {
"$ref": "#/$defs/collection"
}
},
"codeSnippets": {
"type": "array",
"description": "Reviewed bounded code snippets.",
"items": {
"$ref": "#/$defs/codeSnippet"
}
},
"seo": {
"$ref": "#/$defs/seo"
}
},
"required": [
"intent",
"siteTitle",
"siteDescription",
"contactEmail",
"navigation",
"footerNavigation",
"menus",
"styleClasses",
"theme",
"document",
"collections",
"codeSnippets"
],
"additionalProperties": false
},
"createSite": {
"type": "object",
"description": "Brief used to create a new TopoloWeb site.",
"properties": {
"name": {
"type": "string",
"description": "Internal and initial public site name.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"description": "Business or project category.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Primary intended audience.",
"minLength": 1
},
"offer": {
"type": "string",
"description": "Primary product, service, or proposition.",
"minLength": 1
},
"tone": {
"type": "string",
"description": "Desired writing and visual tone.",
"minLength": 1
},
"location": {
"type": "string",
"description": "Optional geographic market."
},
"differentiators": {
"type": "array",
"description": "Specific differentiators to communicate.",
"items": {
"type": "string",
"description": "One differentiator."
}
},
"goals": {
"type": "array",
"description": "Desired user and business outcomes.",
"items": {
"type": "string",
"description": "One goal."
}
},
"prompt": {
"type": "string",
"description": "Additional generation direction."
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"qualityIssue": {
"type": "object",
"description": "One actionable launch-quality finding.",
"properties": {
"id": {
"type": "string",
"description": "Stable issue code.",
"minLength": 1
},
"severity": {
"type": "string",
"description": "Issue severity.",
"enum": [
"info",
"warning",
"error"
]
},
"title": {
"type": "string",
"description": "Short issue title.",
"minLength": 1
},
"detail": {
"type": "string",
"description": "Actionable remediation detail.",
"minLength": 1
}
},
"required": [
"id",
"severity",
"title",
"detail"
],
"additionalProperties": false
},
"qualityReport": {
"type": "object",
"description": "Deterministic content and launch-quality report.",
"properties": {
"generatedAt": {
"type": "string",
"description": "ISO-8601 generation timestamp.",
"format": "date-time"
},
"score": {
"type": "number",
"description": "Quality score from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"description": "Actionable quality findings.",
"items": {
"$ref": "#/$defs/qualityIssue"
}
}
},
"required": [
"generatedAt",
"score",
"issues"
],
"additionalProperties": false
},
"siteRecord": {
"type": "object",
"description": "One TopoloWeb site and its current editable content.",
"properties": {
"id": {
"type": "string",
"description": "Stable site identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Platform hostname slug.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Internal site name.",
"minLength": 1
},
"status": {
"type": "string",
"description": "Current lifecycle status.",
"enum": [
"draft",
"published",
"archived"
]
},
"brief": {
"type": "object",
"description": "Generation brief retained for iterative edits.",
"additionalProperties": true
},
"draftContent": {
"$ref": "#/$defs/siteContent"
},
"currentVersionId": {
"type": "string",
"description": "Currently published immutable version identifier."
},
"draftPreviewToken": {
"type": "string",
"description": "Opaque token used by the draft preview URL.",
"minLength": 1
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"slug",
"name",
"status",
"brief",
"draftContent",
"draftPreviewToken",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteVersion": {
"type": "object",
"description": "One immutable published site version.",
"properties": {
"id": {
"type": "string",
"description": "Stable version identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"versionNumber": {
"type": "integer",
"description": "Monotonic site version number.",
"minimum": 1
},
"label": {
"type": "string",
"description": "Human-readable version label.",
"minLength": 1
},
"snapshot": {
"$ref": "#/$defs/siteContent"
},
"previewToken": {
"type": "string",
"description": "Opaque immutable-version preview token.",
"minLength": 1
},
"publishedAt": {
"type": "string",
"description": "ISO-8601 publication timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"versionNumber",
"label",
"snapshot",
"previewToken",
"publishedAt"
],
"additionalProperties": false
},
"siteDomain": {
"type": "object",
"description": "One platform or custom site domain.",
"properties": {
"id": {
"type": "string",
"description": "Stable domain identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"hostname": {
"type": "string",
"description": "Domain hostname without scheme.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Domain ownership kind.",
"enum": [
"platform",
"custom"
]
},
"status": {
"type": "string",
"description": "DNS and TLS activation status.",
"enum": [
"pending_dns",
"pending_ssl",
"active",
"failed"
]
},
"dnsTarget": {
"type": "string",
"description": "DNS target required for this domain.",
"minLength": 1
},
"verificationToken": {
"type": "string",
"description": "Opaque DNS ownership verification token.",
"minLength": 1
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the primary public hostname."
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"hostname",
"kind",
"status",
"dnsTarget",
"verificationToken",
"isPrimary",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteUrls": {
"type": "object",
"description": "Stable URLs used to preview and verify the site.",
"properties": {
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public site URL.",
"format": "uri"
}
},
"required": [
"previewUrl",
"publicUrl"
],
"additionalProperties": false
},
"siteDetails": {
"type": "object",
"description": "Complete editable site state returned after a build.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One site form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions"
],
"additionalProperties": false
}
}
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"site": {
"name": "example",
"businessType": "example",
"audience": "example",
"offer": "example",
"tone": "example"
},
"content": {
"intent": "business_site",
"siteTitle": "example",
"siteDescription": "example",
"contactEmail": "user@example.com",
"navigation": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"href": "example",
"kind": "primary"
}
],
"footerNavigation": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"href": "example",
"kind": "primary"
}
],
"menus": [
{
"id": "00000000-0000-4000-8000-000000000000",
"name": "example",
"placement": "custom",
"items": []
}
],
"styleClasses": [
{
"id": "00000000-0000-4000-8000-000000000000",
"name": "example",
"targetKind": "container",
"targetScope": "section",
"style": {
"backgroundColor": "example",
"backgroundImageUrl": "https://example.com",
"backgroundMode": "cover"
}
}
],
"theme": {
"primary": "example",
"secondary": "example",
"surface": "example",
"ink": "example",
"muted": "example",
"accent": "example",
"accentSoft": "example",
"glow": "example",
"headingFont": "example",
"bodyFont": "example",
"radius": "example"
},
"document": {
"version": 1,
"pages": []
},
"collections": [
{
"id": "00000000-0000-4000-8000-000000000000",
"slug": "example",
"kind": "apps",
"label": "example",
"items": []
}
],
"codeSnippets": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"slot": "head",
"code": "example",
"enabled": true
}
]
}
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/validate",
"body": {
"site": {
"name": "example",
"businessType": "example",
"audience": "example",
"offer": "example",
"tone": "example"
},
"content": {
"intent": "business_site",
"siteTitle": "example",
"siteDescription": "example",
"contactEmail": "user@example.com",
"navigation": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"href": "example",
"kind": "primary"
}
],
"footerNavigation": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"href": "example",
"kind": "primary"
}
],
"menus": [
{
"id": "00000000-0000-4000-8000-000000000000",
"name": "example",
"placement": "custom",
"items": []
}
],
"styleClasses": [
{
"id": "00000000-0000-4000-8000-000000000000",
"name": "example",
"targetKind": "container",
"targetScope": "section",
"style": {
"backgroundColor": "example",
"backgroundImageUrl": "https://example.com",
"backgroundMode": "cover"
}
}
],
"theme": {
"primary": "example",
"secondary": "example",
"surface": "example",
"ink": "example",
"muted": "example",
"accent": "example",
"accentSoft": "example",
"glow": "example",
"headingFont": "example",
"bodyFont": "example",
"radius": "example"
},
"document": {
"version": 1,
"pages": []
},
"collections": [
{
"id": "00000000-0000-4000-8000-000000000000",
"slug": "example",
"kind": "apps",
"label": "example",
"items": []
}
],
"codeSnippets": [
{
"id": "00000000-0000-4000-8000-000000000000",
"label": "example",
"slot": "head",
"code": "example",
"enabled": true
}
]
}
}
},
"effects": "Reads state through POST /api/studio/sites/validate without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/validate",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.bootstrap",
"title": "Get site bootstrap",
"description": "Get the site list and selected site for the active workspace.",
"permission": "studio:read",
"method": "GET",
"path": "/api/studio/sites/bootstrap",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"site_id": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"site_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/bootstrap",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/bootstrap without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/bootstrap",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.update",
"title": "Sites Update",
"description": "Call PUT /studio/sites/{siteId}.",
"method": "PUT",
"path": "/api/studio/sites/{siteId}",
"permission": "studio:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"brief": {
"type": "object",
"properties": {
"intent": {
"type": "string",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessName": {
"type": "string",
"minLength": 1
},
"businessType": {
"type": "string",
"minLength": 1
},
"location": {
"type": "string",
"minLength": 1
},
"audience": {
"type": "string",
"minLength": 1
},
"offer": {
"type": "string",
"minLength": 1
},
"tone": {
"type": "string",
"minLength": 1
},
"differentiators": {
"type": "array",
"items": {
"type": "string"
}
},
"goals": {
"type": "array",
"items": {
"type": "string"
}
},
"prompt": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"properties": {
"primary": {
"type": "string",
"minLength": 1
},
"secondary": {
"type": "string",
"minLength": 1
},
"surface": {
"type": "string",
"minLength": 1
},
"ink": {
"type": "string",
"minLength": 1
},
"muted": {
"type": "string",
"minLength": 1
},
"accent": {
"type": "string",
"minLength": 1
},
"accentSoft": {
"type": "string",
"minLength": 1
},
"glow": {
"type": "string",
"minLength": 1
},
"headingFont": {
"type": "string",
"minLength": 1
},
"bodyFont": {
"type": "string",
"minLength": 1
},
"radius": {
"type": "string",
"minLength": 1
},
"brandLogoUrl": {
"type": "string"
},
"brandLogoAlt": {
"type": "string"
},
"brandLogoWidth": {
"type": "string"
},
"brandLogoHeight": {
"type": "string"
},
"pageDefaults": {
"type": "object",
"properties": {
"sectionPaddingTop": {
"type": "number",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"minimum": 0
},
"sectionMarginTop": {
"type": "number"
},
"sectionMarginBottom": {
"type": "number"
},
"sectionMarginLeft": {
"type": "number"
},
"sectionMarginRight": {
"type": "number"
},
"headingSize": {
"type": "number",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"minimum": 0
},
"layoutGap": {
"type": "number",
"minimum": 0
},
"responsive": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"type": "object",
"properties": {
"sectionPaddingTop": {
"type": "number",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"minimum": 0
},
"sectionMarginTop": {
"type": "number"
},
"sectionMarginBottom": {
"type": "number"
},
"sectionMarginLeft": {
"type": "number"
},
"sectionMarginRight": {
"type": "number"
},
"headingSize": {
"type": "number",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"minimum": 0
},
"layoutGap": {
"type": "number",
"minimum": 0
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"customCss": {
"type": "string"
}
},
"additionalProperties": false
},
"navigation": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"label": {
"type": "string",
"minLength": 1
},
"href": {
"type": "string",
"minLength": 1
},
"kind": {
"type": "string",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"minLength": 1
},
"targetBlank": {
"type": "boolean"
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
}
},
"footerNavigation": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"label": {
"type": "string",
"minLength": 1
},
"href": {
"type": "string",
"minLength": 1
},
"kind": {
"type": "string",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"minLength": 1
},
"targetBlank": {
"type": "boolean"
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
}
},
"menus": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"placement": {
"type": "string",
"const": "custom"
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"label": {
"type": "string",
"minLength": 1
},
"href": {
"type": "string",
"minLength": 1
},
"kind": {
"type": "string",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"minLength": 1
},
"targetBlank": {
"type": "boolean"
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
}
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"slug": {
"type": "string",
"minLength": 1
},
"kind": {
"type": "string",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"minLength": 1
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string"
},
"meta": {
"type": "string",
"minLength": 1
},
"value": {
"type": "string",
"minLength": 1
},
"badge": {
"type": "string",
"minLength": 1
},
"href": {
"type": "string",
"minLength": 1
},
"targetBlank": {
"type": "boolean"
},
"imageUrl": {
"type": "string"
},
"alt": {
"type": "string"
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
}
},
"styleClasses": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"targetKind": {
"type": "string",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"const": "section"
},
"style": {
"type": "object",
"properties": {
"backgroundColor": {
"type": "string"
},
"backgroundImageUrl": {
"type": "string"
},
"backgroundMode": {
"type": "string",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string"
},
"textAlign": {
"type": "string",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number"
},
"paddingBottom": {
"type": "number"
},
"paddingBlockLinked": {
"type": "boolean"
},
"paddingLeft": {
"type": "number"
},
"paddingRight": {
"type": "number"
},
"paddingInlineLinked": {
"type": "boolean"
},
"marginTop": {
"type": "number"
},
"marginBottom": {
"type": "number"
},
"marginBlockLinked": {
"type": "boolean"
},
"marginLeft": {
"type": "number"
},
"marginRight": {
"type": "number"
},
"marginInlineLinked": {
"type": "boolean"
},
"borderWidth": {
"type": "number"
},
"borderStyle": {
"type": "string",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string"
},
"borderRadius": {
"type": "number"
},
"headingSize": {
"type": "number"
},
"headingLineHeight": {
"type": "number"
},
"bodySize": {
"type": "number"
},
"bodyLineHeight": {
"type": "number"
},
"cardPadding": {
"type": "number"
},
"columnCount": {
"anyOf": [
{
"type": "number",
"const": 2
},
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 4
}
]
},
"columnSpans": {
"type": "array",
"items": {
"type": "number"
}
},
"layoutGap": {
"type": "number"
},
"nestedSectionPadding": {
"type": "number"
},
"mediaAspectRatio": {
"type": "string",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number"
},
"mediaFocalY": {
"type": "number"
},
"dividerTop": {
"type": "boolean"
},
"dividerBottom": {
"type": "boolean"
},
"dividerThickness": {
"type": "number"
},
"dividerWidth": {
"type": "number"
},
"dividerLineStyle": {
"type": "string",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string"
},
"responsive": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"type": "object",
"properties": {
"backgroundColor": {
"type": "string"
},
"backgroundImageUrl": {
"type": "string"
},
"backgroundMode": {
"type": "string",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string"
},
"textAlign": {
"type": "string",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number"
},
"paddingBottom": {
"type": "number"
},
"paddingBlockLinked": {
"type": "boolean"
},
"paddingLeft": {
"type": "number"
},
"paddingRight": {
"type": "number"
},
"paddingInlineLinked": {
"type": "boolean"
},
"marginTop": {
"type": "number"
},
"marginBottom": {
"type": "number"
},
"marginBlockLinked": {
"type": "boolean"
},
"marginLeft": {
"type": "number"
},
"marginRight": {
"type": "number"
},
"marginInlineLinked": {
"type": "boolean"
},
"borderWidth": {
"type": "number"
},
"borderStyle": {
"type": "string",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string"
},
"borderRadius": {
"type": "number"
},
"headingSize": {
"type": "number"
},
"headingLineHeight": {
"type": "number"
},
"bodySize": {
"type": "number"
},
"bodyLineHeight": {
"type": "number"
},
"cardPadding": {
"type": "number"
},
"columnCount": {
"anyOf": [
{
"type": "number",
"const": 2
},
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 4
}
]
},
"columnSpans": {
"type": "array",
"items": {
"type": "number"
}
},
"layoutGap": {
"type": "number"
},
"nestedSectionPadding": {
"type": "number"
},
"mediaAspectRatio": {
"type": "string",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number"
},
"mediaFocalY": {
"type": "number"
},
"dividerTop": {
"type": "boolean"
},
"dividerBottom": {
"type": "boolean"
},
"dividerThickness": {
"type": "number"
},
"dividerWidth": {
"type": "number"
},
"dividerLineStyle": {
"type": "string",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"targetKind": {
"type": "string",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"const": "item"
},
"style": {
"type": "object",
"properties": {
"padding": {
"type": "number"
},
"radius": {
"type": "number"
},
"borderWidth": {
"type": "number"
},
"borderStyle": {
"type": "string",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string"
},
"imageFit": {
"type": "string",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number"
},
"imageFocalY": {
"type": "number"
},
"textPadding": {
"type": "number"
},
"textRadius": {
"type": "number"
},
"textAlign": {
"type": "string",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number"
},
"headingLineHeight": {
"type": "number"
},
"bodySize": {
"type": "number"
},
"bodyLineHeight": {
"type": "number"
},
"responsive": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"type": "object",
"properties": {
"padding": {
"type": "number"
},
"radius": {
"type": "number"
},
"borderWidth": {
"type": "number"
},
"borderStyle": {
"type": "string",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string"
},
"imageFit": {
"type": "string",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number"
},
"imageFocalY": {
"type": "number"
},
"textPadding": {
"type": "number"
},
"textRadius": {
"type": "number"
},
"textAlign": {
"type": "string",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number"
},
"headingLineHeight": {
"type": "number"
},
"bodySize": {
"type": "number"
},
"bodyLineHeight": {
"type": "number"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
}
},
"codeSnippets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"label": {
"type": "string",
"minLength": 1
},
"slot": {
"type": "string",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string"
},
"enabled": {
"type": "boolean"
}
},
"required": [
"label",
"slot",
"code"
],
"additionalProperties": false
}
},
"seo": {
"type": "object",
"properties": {
"titleTemplate": {
"type": "string",
"minLength": 1
},
"metaTitle": {
"type": "string",
"minLength": 1
},
"metaDescription": {
"type": "string",
"minLength": 1
},
"faviconUrl": {
"type": "string",
"minLength": 1
},
"openGraphImageUrl": {
"type": "string",
"minLength": 1
},
"canonicalUrl": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"announcementBar": {
"anyOf": [
{
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"text": {
"type": "string",
"minLength": 1
},
"href": {
"type": "string",
"minLength": 1
}
},
"required": [
"enabled",
"text"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false,
"$defs": {
"jsonValue": {
"description": "A JSON-compatible component property value.",
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/jsonValue"
}
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
}
]
},
"actionLink": {
"type": "object",
"description": "A rendered call-to-action link.",
"properties": {
"label": {
"type": "string",
"description": "Visible link label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, mailto, tel, or HTTPS URL.",
"minLength": 1
},
"linkKind": {
"type": "string",
"description": "Whether the link targets a TopoloWeb page or a custom URL.",
"enum": [
"custom",
"page"
]
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"label",
"href"
],
"additionalProperties": false
},
"navigationItem": {
"type": "object",
"description": "One site navigation entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable navigation item identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Visible navigation label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, or external URL.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Navigation emphasis.",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"description": "Optional parent item identifier for one-level menus."
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
},
"navigationMenu": {
"type": "object",
"description": "A named reusable navigation menu.",
"properties": {
"id": {
"type": "string",
"description": "Stable menu identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable menu name.",
"minLength": 1
},
"placement": {
"type": "string",
"description": "Custom menu placement marker.",
"const": "custom"
},
"items": {
"type": "array",
"description": "Ordered menu entries.",
"items": {
"$ref": "#/$defs/navigationItem"
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
},
"pageStyleDefaultsBase": {
"type": "object",
"description": "Site-wide default layout and typography values.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
}
},
"additionalProperties": false
},
"pageStyleDefaults": {
"type": "object",
"description": "Desktop page defaults with optional viewport overrides.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
},
"responsive": {
"type": "object",
"description": "Viewport-specific page-default overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/pageStyleDefaultsBase"
}
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"description": "Complete TopoloWeb theme and responsive page defaults.",
"properties": {
"primary": {
"type": "string",
"description": "Primary brand color.",
"minLength": 1
},
"secondary": {
"type": "string",
"description": "Secondary brand color.",
"minLength": 1
},
"surface": {
"type": "string",
"description": "Primary surface color.",
"minLength": 1
},
"ink": {
"type": "string",
"description": "Primary text color.",
"minLength": 1
},
"muted": {
"type": "string",
"description": "Muted text color.",
"minLength": 1
},
"accent": {
"type": "string",
"description": "Accent color.",
"minLength": 1
},
"accentSoft": {
"type": "string",
"description": "Soft accent surface color.",
"minLength": 1
},
"glow": {
"type": "string",
"description": "Decorative glow color.",
"minLength": 1
},
"headingFont": {
"type": "string",
"description": "CSS heading font stack.",
"minLength": 1
},
"bodyFont": {
"type": "string",
"description": "CSS body font stack.",
"minLength": 1
},
"radius": {
"type": "string",
"description": "Default CSS corner radius.",
"minLength": 1
},
"brandLogoUrl": {
"type": "string",
"description": "HTTPS brand-logo URL."
},
"brandLogoAlt": {
"type": "string",
"description": "Accessible brand-logo description."
},
"brandLogoWidth": {
"type": "string",
"description": "CSS brand-logo width."
},
"brandLogoHeight": {
"type": "string",
"description": "CSS brand-logo height."
},
"pageDefaults": {
"$ref": "#/$defs/pageStyleDefaults"
},
"customCss": {
"type": "string",
"description": "Reviewed site-wide CSS loaded after generated styles."
}
},
"required": [
"primary",
"secondary",
"surface",
"ink",
"muted",
"accent",
"accentSoft",
"glow",
"headingFont",
"bodyFont",
"radius"
],
"additionalProperties": false
},
"sectionStyleBase": {
"type": "object",
"description": "Desktop section style values.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
}
},
"additionalProperties": false
},
"sectionStyle": {
"type": "object",
"description": "Section style values with optional responsive overrides.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
},
"responsive": {
"type": "object",
"description": "Viewport-specific section-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItemStyleBase": {
"type": "object",
"description": "Desktop repeated-item style values.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
}
},
"additionalProperties": false
},
"sectionItemStyle": {
"type": "object",
"description": "Repeated-item style values with optional responsive overrides.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
},
"responsive": {
"type": "object",
"description": "Viewport-specific item-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionItemStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItem": {
"type": "object",
"description": "One repeated card, row, quote, metric, question, or media item.",
"properties": {
"id": {
"type": "string",
"description": "Stable item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title."
},
"body": {
"type": "string",
"description": "Visible supporting copy."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional value or price."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
},
"styleClassIds": {
"type": "array",
"description": "Reusable item style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"sectionValue": {
"type": "object",
"description": "Renderer-backed block content without persisted child arrays.",
"properties": {
"id": {
"type": "string",
"description": "Stable section identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"eyebrow": {
"type": "string",
"description": "Optional eyebrow copy."
},
"title": {
"type": "string",
"description": "Visible section heading."
},
"body": {
"type": "string",
"description": "Visible section body copy."
},
"kicker": {
"type": "string",
"description": "Optional supporting kicker."
},
"primaryAction": {
"$ref": "#/$defs/actionLink"
},
"secondaryAction": {
"$ref": "#/$defs/actionLink"
},
"imageUrl": {
"type": "string",
"description": "Optional section image URL."
},
"alt": {
"type": "string",
"description": "Accessible section-image description."
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"styleClassIds": {
"type": "array",
"description": "Reusable section style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
},
"style": {
"$ref": "#/$defs/sectionStyle"
},
"formId": {
"type": "string",
"description": "Form identifier for a contact-form block."
},
"collectionSlug": {
"type": "string",
"description": "Collection slug bound to this block."
},
"collectionLimit": {
"type": "number",
"description": "Maximum collection entries rendered.",
"minimum": 1
},
"collectionSort": {
"type": "string",
"description": "Collection sorting behavior.",
"enum": [
"manual",
"title_asc",
"title_desc",
"meta_asc",
"meta_desc"
]
},
"html": {
"type": "string",
"description": "Reviewed HTML for embed-capable blocks."
},
"videoUrl": {
"type": "string",
"description": "Direct, YouTube, or Vimeo video URL."
},
"videoProvider": {
"type": "string",
"description": "Video provider.",
"enum": [
"direct",
"youtube",
"vimeo"
]
},
"videoPosterUrl": {
"type": "string",
"description": "Video poster image URL."
},
"videoAutoplay": {
"type": "boolean",
"description": "Autoplay video when allowed."
},
"videoControls": {
"type": "boolean",
"description": "Show native video controls."
},
"videoMuted": {
"type": "boolean",
"description": "Mute video playback."
},
"componentName": {
"type": "string",
"description": "Approved custom component name."
},
"componentProps": {
"type": "object",
"description": "Component-specific reviewed JSON properties.",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
},
"menuId": {
"type": "string",
"description": "Reusable menu identifier bound to a menu block."
}
},
"required": [
"id",
"kind",
"title",
"body"
],
"additionalProperties": false
},
"pageValue": {
"type": "object",
"description": "Persisted page metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable page identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Root-relative page slug beginning with /.",
"pattern": "^/"
},
"title": {
"type": "string",
"description": "Visible page heading and title-template input.",
"minLength": 1
},
"description": {
"type": "string",
"description": "Page search and social description."
}
},
"required": [
"id",
"slug",
"title",
"description"
],
"additionalProperties": false
},
"columnValue": {
"type": "object",
"description": "Persisted layout-column metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable column identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional editor label."
},
"span": {
"type": "number",
"description": "Grid span.",
"minimum": 1
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Original product-domain identity for a document node.",
"properties": {
"kind": {
"type": "string",
"description": "Source record kind.",
"enum": [
"page",
"section",
"column",
"item"
]
},
"id": {
"type": "string",
"description": "Source record identifier.",
"minLength": 1
}
},
"required": [
"kind",
"id"
],
"additionalProperties": false
},
"pageNode": {
"type": "object",
"description": "A canonical page node owning exactly one page-body slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "page"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Parent node identifier when nested."
},
"source": {
"$ref": "#/$defs/source"
},
"value": {
"$ref": "#/$defs/pageValue"
},
"children": {
"type": "array",
"description": "Exactly one page-body slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"value",
"children"
],
"additionalProperties": false
},
"slotNode": {
"type": "object",
"description": "A canonical child slot controlling accepted node kinds.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "slot"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning page, layout, or block node identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"slotKind": {
"type": "string",
"description": "Child-slot role.",
"enum": [
"page-body",
"layout-column",
"block-items"
]
},
"accepts": {
"type": "array",
"description": "Document node kinds allowed in this slot.",
"items": {
"type": "string",
"description": "One allowed node kind.",
"enum": [
"layout",
"block",
"item"
]
}
},
"parentSectionId": {
"type": "string",
"description": "Owning section identifier for layout and block slots."
},
"columnId": {
"type": "string",
"description": "Column identifier for layout-column slots."
},
"value": {
"$ref": "#/$defs/columnValue"
},
"children": {
"type": "array",
"description": "Canonical child nodes.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"slotKind",
"accepts",
"children"
],
"additionalProperties": false
},
"layoutNode": {
"type": "object",
"description": "A canonical layout block owning one or more layout-column slots.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "layout"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"layoutKind": {
"type": "string",
"description": "Layout behavior.",
"enum": [
"container",
"grid",
"stack",
"flex-row",
"columns"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Layout-column slots.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"layoutKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"blockNode": {
"type": "object",
"description": "A canonical renderer block with optional block-items slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "block"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"blockKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Optional block-items slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"blockKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"itemNode": {
"type": "object",
"description": "A canonical repeated-item leaf node.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "item"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning block-items slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"parentSectionId": {
"type": "string",
"description": "Owning block section identifier.",
"minLength": 1
},
"itemId": {
"type": "string",
"description": "Persisted item identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionItem"
},
"children": {
"type": "array",
"description": "Item nodes are leaves and must have no children.",
"maxItems": 0
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"parentSectionId",
"itemId",
"value",
"children"
],
"additionalProperties": false
},
"siteDocumentNode": {
"description": "One canonical TopoloWeb document node.",
"oneOf": [
{
"$ref": "#/$defs/pageNode"
},
{
"$ref": "#/$defs/slotNode"
},
{
"$ref": "#/$defs/layoutNode"
},
{
"$ref": "#/$defs/blockNode"
},
{
"$ref": "#/$defs/itemNode"
}
]
},
"siteDocument": {
"type": "object",
"description": "Canonical versioned TopoloWeb document tree.",
"properties": {
"version": {
"type": "integer",
"description": "Document schema version.",
"const": 1
},
"pages": {
"type": "array",
"description": "Canonical page nodes.",
"items": {
"$ref": "#/$defs/pageNode"
}
}
},
"required": [
"version",
"pages"
],
"additionalProperties": false
},
"styleClass": {
"description": "A reusable section or item style class.",
"oneOf": [
{
"type": "object",
"description": "Reusable section style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "section"
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Reusable repeated-item style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "item"
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
},
"collectionItem": {
"type": "object",
"description": "One reusable CMS collection entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection-item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title.",
"minLength": 1
},
"body": {
"type": "string",
"description": "Visible item body."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional price or value."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"collection": {
"type": "object",
"description": "Reusable CMS collection.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Stable collection slug.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Collection content kind.",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"description": "Human-readable collection label.",
"minLength": 1
},
"items": {
"type": "array",
"description": "Ordered collection entries.",
"items": {
"$ref": "#/$defs/collectionItem"
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
},
"codeSnippet": {
"type": "object",
"description": "Reviewed bounded code injection.",
"properties": {
"id": {
"type": "string",
"description": "Stable snippet identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable snippet label.",
"minLength": 1
},
"slot": {
"type": "string",
"description": "Injection slot.",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string",
"description": "Reviewed HTML, CSS, or JavaScript source."
},
"enabled": {
"type": "boolean",
"description": "Whether this snippet is active."
}
},
"required": [
"id",
"label",
"slot",
"code",
"enabled"
],
"additionalProperties": false
},
"seo": {
"type": "object",
"description": "Site-wide search and social metadata defaults.",
"properties": {
"titleTemplate": {
"type": "string",
"description": "Title template; %s is replaced by the page title."
},
"metaTitle": {
"type": "string",
"description": "Default page title override."
},
"metaDescription": {
"type": "string",
"description": "Default search and social description."
},
"faviconUrl": {
"type": "string",
"description": "Browser and bookmark icon URL."
},
"openGraphImageUrl": {
"type": "string",
"description": "Default Open Graph image URL."
},
"canonicalUrl": {
"type": "string",
"description": "Canonical site URL."
}
},
"additionalProperties": false
},
"siteContent": {
"type": "object",
"description": "Complete canonical TopoloWeb site content.",
"properties": {
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"siteTitle": {
"type": "string",
"description": "Public site title.",
"minLength": 1
},
"siteDescription": {
"type": "string",
"description": "Public site description."
},
"contactEmail": {
"type": "string",
"description": "Public contact email.",
"minLength": 1
},
"contactPhone": {
"type": "string",
"description": "Optional public contact phone number."
},
"navigation": {
"type": "array",
"description": "Primary site navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"footerNavigation": {
"type": "array",
"description": "Footer navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"menus": {
"type": "array",
"description": "Reusable custom menus.",
"items": {
"$ref": "#/$defs/navigationMenu"
}
},
"styleClasses": {
"type": "array",
"description": "Reusable section and item styles.",
"items": {
"$ref": "#/$defs/styleClass"
}
},
"theme": {
"$ref": "#/$defs/theme"
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"description": "Reusable CMS collections.",
"items": {
"$ref": "#/$defs/collection"
}
},
"codeSnippets": {
"type": "array",
"description": "Reviewed bounded code snippets.",
"items": {
"$ref": "#/$defs/codeSnippet"
}
},
"seo": {
"$ref": "#/$defs/seo"
}
},
"required": [
"intent",
"siteTitle",
"siteDescription",
"contactEmail",
"navigation",
"footerNavigation",
"menus",
"styleClasses",
"theme",
"document",
"collections",
"codeSnippets"
],
"additionalProperties": false
},
"createSite": {
"type": "object",
"description": "Brief used to create a new TopoloWeb site.",
"properties": {
"name": {
"type": "string",
"description": "Internal and initial public site name.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"description": "Business or project category.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Primary intended audience.",
"minLength": 1
},
"offer": {
"type": "string",
"description": "Primary product, service, or proposition.",
"minLength": 1
},
"tone": {
"type": "string",
"description": "Desired writing and visual tone.",
"minLength": 1
},
"location": {
"type": "string",
"description": "Optional geographic market."
},
"differentiators": {
"type": "array",
"description": "Specific differentiators to communicate.",
"items": {
"type": "string",
"description": "One differentiator."
}
},
"goals": {
"type": "array",
"description": "Desired user and business outcomes.",
"items": {
"type": "string",
"description": "One goal."
}
},
"prompt": {
"type": "string",
"description": "Additional generation direction."
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"qualityIssue": {
"type": "object",
"description": "One actionable launch-quality finding.",
"properties": {
"id": {
"type": "string",
"description": "Stable issue code.",
"minLength": 1
},
"severity": {
"type": "string",
"description": "Issue severity.",
"enum": [
"info",
"warning",
"error"
]
},
"title": {
"type": "string",
"description": "Short issue title.",
"minLength": 1
},
"detail": {
"type": "string",
"description": "Actionable remediation detail.",
"minLength": 1
}
},
"required": [
"id",
"severity",
"title",
"detail"
],
"additionalProperties": false
},
"qualityReport": {
"type": "object",
"description": "Deterministic content and launch-quality report.",
"properties": {
"generatedAt": {
"type": "string",
"description": "ISO-8601 generation timestamp.",
"format": "date-time"
},
"score": {
"type": "number",
"description": "Quality score from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"description": "Actionable quality findings.",
"items": {
"$ref": "#/$defs/qualityIssue"
}
}
},
"required": [
"generatedAt",
"score",
"issues"
],
"additionalProperties": false
},
"siteRecord": {
"type": "object",
"description": "One TopoloWeb site and its current editable content.",
"properties": {
"id": {
"type": "string",
"description": "Stable site identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Platform hostname slug.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Internal site name.",
"minLength": 1
},
"status": {
"type": "string",
"description": "Current lifecycle status.",
"enum": [
"draft",
"published",
"archived"
]
},
"brief": {
"type": "object",
"description": "Generation brief retained for iterative edits.",
"additionalProperties": true
},
"draftContent": {
"$ref": "#/$defs/siteContent"
},
"currentVersionId": {
"type": "string",
"description": "Currently published immutable version identifier."
},
"draftPreviewToken": {
"type": "string",
"description": "Opaque token used by the draft preview URL.",
"minLength": 1
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"slug",
"name",
"status",
"brief",
"draftContent",
"draftPreviewToken",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteVersion": {
"type": "object",
"description": "One immutable published site version.",
"properties": {
"id": {
"type": "string",
"description": "Stable version identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"versionNumber": {
"type": "integer",
"description": "Monotonic site version number.",
"minimum": 1
},
"label": {
"type": "string",
"description": "Human-readable version label.",
"minLength": 1
},
"snapshot": {
"$ref": "#/$defs/siteContent"
},
"previewToken": {
"type": "string",
"description": "Opaque immutable-version preview token.",
"minLength": 1
},
"publishedAt": {
"type": "string",
"description": "ISO-8601 publication timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"versionNumber",
"label",
"snapshot",
"previewToken",
"publishedAt"
],
"additionalProperties": false
},
"siteDomain": {
"type": "object",
"description": "One platform or custom site domain.",
"properties": {
"id": {
"type": "string",
"description": "Stable domain identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"hostname": {
"type": "string",
"description": "Domain hostname without scheme.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Domain ownership kind.",
"enum": [
"platform",
"custom"
]
},
"status": {
"type": "string",
"description": "DNS and TLS activation status.",
"enum": [
"pending_dns",
"pending_ssl",
"active",
"failed"
]
},
"dnsTarget": {
"type": "string",
"description": "DNS target required for this domain.",
"minLength": 1
},
"verificationToken": {
"type": "string",
"description": "Opaque DNS ownership verification token.",
"minLength": 1
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the primary public hostname."
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"hostname",
"kind",
"status",
"dnsTarget",
"verificationToken",
"isPrimary",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteUrls": {
"type": "object",
"description": "Stable URLs used to preview and verify the site.",
"properties": {
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public site URL.",
"format": "uri"
}
},
"required": [
"previewUrl",
"publicUrl"
],
"additionalProperties": false
},
"siteDetails": {
"type": "object",
"description": "Complete editable site state returned after a build.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One site form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions"
],
"additionalProperties": false
}
}
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Update.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PUT",
"path": "/api/studio/sites/example",
"body": {
"siteId": "example"
}
},
"effects": "May change state through PUT /api/studio/sites/{siteId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/studio/sites/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.unpublish",
"title": "Unpublish site",
"description": "Remove the active published version from one site.",
"permission": "studio:write",
"method": "POST",
"path": "/api/studio/sites/{siteId}/unpublish",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/unpublish",
"body": {
"siteId": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/unpublish. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/unpublish",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.archive",
"title": "Archive site",
"description": "Archive one site.",
"permission": "studio:write",
"method": "POST",
"path": "/api/studio/sites/{siteId}/archive",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/archive",
"body": {
"siteId": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/archive. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/archive",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.delete",
"title": "Delete site",
"description": "Permanently delete one site and its owned content.",
"permission": "studio:write",
"method": "DELETE",
"path": "/api/studio/sites/{siteId}",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/studio/sites/example",
"body": null
},
"effects": "May change state through DELETE /api/studio/sites/{siteId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/studio/sites/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.collections.update",
"title": "Sites Collections Update",
"description": "Call PUT /studio/sites/{siteId}/collections.",
"method": "PUT",
"path": "/api/studio/sites/{siteId}/collections",
"permission": "studio:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"collections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"slug": {
"type": "string",
"minLength": 1
},
"kind": {
"type": "string",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"minLength": 1
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string"
},
"meta": {
"type": "string",
"minLength": 1
},
"value": {
"type": "string",
"minLength": 1
},
"badge": {
"type": "string",
"minLength": 1
},
"href": {
"type": "string",
"minLength": 1
},
"targetBlank": {
"type": "boolean"
},
"imageUrl": {
"type": "string"
},
"alt": {
"type": "string"
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
}
}
},
"required": [
"siteId",
"collections"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Collections Update.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"collections": [
{
"id": "00000000-0000-4000-8000-000000000000",
"slug": "example",
"kind": "apps",
"label": "example",
"items": [
{
"id": "00000000-0000-4000-8000-000000000000",
"title": "example",
"body": "example"
}
]
}
]
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PUT",
"path": "/api/studio/sites/example/collections",
"body": {
"siteId": "example",
"collections": [
{
"id": "00000000-0000-4000-8000-000000000000",
"slug": "example",
"kind": "apps",
"label": "example",
"items": [
{
"id": "00000000-0000-4000-8000-000000000000",
"title": "example",
"body": "example"
}
]
}
]
}
},
"effects": "May change state through PUT /api/studio/sites/{siteId}/collections. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/studio/sites/*/collections",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.collections.import",
"title": "Import site collection",
"description": "Import a CSV into one site collection and persist the import result.",
"permission": "studio:write",
"method": "POST",
"path": "/api/studio/sites/{siteId}/collections/import",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"id": {
"type": "string",
"minLength": 1
},
"slug": {
"type": "string",
"minLength": 1
},
"kind": {
"type": "string",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"minLength": 1
},
"csv": {
"type": "string",
"minLength": 1,
"maxLength": 1048576
}
},
"required": [
"siteId",
"slug",
"kind",
"label",
"csv"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"siteId": "example",
"slug": "example",
"kind": "apps",
"label": "example",
"csv": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/collections/import",
"body": {
"siteId": "example",
"slug": "example",
"kind": "apps",
"label": "example",
"csv": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/collections/import. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/collections/import",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.code_snippets.create",
"title": "Sites Code Snippets Create",
"description": "Call POST /studio/sites/{siteId}/code-snippets.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/code-snippets",
"permission": "settings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"label": {
"type": "string",
"minLength": 1
},
"slot": {
"type": "string",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"label",
"slot",
"code",
"siteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Code Snippets Create.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"label": "example",
"slot": "head",
"code": "example",
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/code-snippets",
"body": {
"label": "example",
"slot": "head",
"code": "example",
"siteId": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/code-snippets. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/code-snippets",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.code_snippets.update",
"title": "Sites Code Snippets Update",
"description": "Call PUT /studio/sites/{siteId}/code-snippets/{snippetId}.",
"method": "PUT",
"path": "/api/studio/sites/{siteId}/code-snippets/{snippetId}",
"permission": "settings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"label": {
"type": "string",
"minLength": 1
},
"slot": {
"type": "string",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"siteId": {
"type": "string",
"minLength": 1
},
"snippetId": {
"type": "string",
"minLength": 1
}
},
"required": [
"label",
"slot",
"code",
"siteId",
"snippetId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Code Snippets Update.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"label": "example",
"slot": "head",
"code": "example",
"siteId": "example",
"snippetId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PUT",
"path": "/api/studio/sites/example/code-snippets/example",
"body": {
"label": "example",
"slot": "head",
"code": "example",
"siteId": "example",
"snippetId": "example"
}
},
"effects": "May change state through PUT /api/studio/sites/{siteId}/code-snippets/{snippetId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/studio/sites/*/code-snippets/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.code_snippets.delete",
"title": "Sites Code Snippets Delete",
"description": "Call DELETE /studio/sites/{siteId}/code-snippets/{snippetId}.",
"method": "DELETE",
"path": "/api/studio/sites/{siteId}/code-snippets/{snippetId}",
"permission": "settings:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"snippetId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId",
"snippetId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Code Snippets Delete.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"snippetId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/studio/sites/example/code-snippets/example",
"body": null
},
"effects": "May change state through DELETE /api/studio/sites/{siteId}/code-snippets/{snippetId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/studio/sites/*/code-snippets/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.agent_sessions.create",
"title": "Sites Agent Sessions Create",
"description": "Call POST /studio/sites/{siteId}/agent/sessions.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/agent/sessions",
"permission": "studio:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Agent Sessions Create.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/web#agent-editing",
"resource": {
"kind": "agent_session",
"idPath": "session.id"
},
"effects": [
"Creates one reviewable editing session without changing site content."
],
"errors": [
{
"status": 401,
"code": "authentication_required",
"recovery": "Authenticate again with Topolo Auth, then retry once."
},
{
"status": 403,
"code": "permission_denied",
"recovery": "Use a credential with studio:write for the selected workspace."
},
{
"status": 404,
"code": "site_not_found",
"recovery": "List sites in the selected workspace and retry with a returned site id."
}
],
"verify": [
"Call app_topolo_web.sites.agent_sessions.get with the returned session.id."
],
"nextActionIds": [
"app_topolo_web.sites.agent_sessions.messages.create"
]
},
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/agent/sessions",
"body": {
"siteId": "example"
}
},
"effects": "Creates one reviewable editing session without changing site content.",
"verification": [
"Call app_topolo_web.sites.agent_sessions.get with the returned session.id."
],
"recovery": [
"401 authentication_required: Authenticate again with Topolo Auth, then retry once.",
"403 permission_denied: Use a credential with studio:write for the selected workspace.",
"404 site_not_found: List sites in the selected workspace and retry with a returned site id."
],
"docs_url": "https://docs.topolo.app/applications/web#agent-editing",
"resource": {
"kind": "agent_session",
"idPath": "session.id"
},
"next_action_ids": [
"app_topolo_web.sites.agent_sessions.messages.create"
],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/agent/sessions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.agent_sessions.messages.create",
"title": "Sites Agent Sessions Messages Create",
"description": "Call POST /studio/sites/{siteId}/agent/sessions/{sessionId}/messages.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/agent/sessions/{sessionId}/messages",
"permission": "studio:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"sessionId": {
"type": "string",
"minLength": 1
},
"content": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId",
"sessionId",
"content"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Agent Sessions Messages Create.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/web#agent-editing",
"resource": {
"kind": "agent_proposal",
"idPath": "proposals.0.id"
},
"effects": [
"Adds one user instruction and creates a pending, reviewable site proposal."
],
"errors": [
{
"status": 503,
"code": "dependency_unavailable",
"recovery": "Keep the current session, wait for the proposal dependency to recover, then send a new instruction once."
}
],
"verify": [
"Call app_topolo_web.sites.agent_sessions.get and confirm the returned pending proposal matches the instruction."
],
"nextActionIds": [
"app_topolo_web.sites.agent_sessions.proposals.apply",
"app_topolo_web.sites.agent_sessions.proposals.reject"
]
},
"documentation": {
"example_input": {
"siteId": "example",
"sessionId": "example",
"content": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/agent/sessions/example/messages",
"body": {
"siteId": "example",
"sessionId": "example",
"content": "example"
}
},
"effects": "Adds one user instruction and creates a pending, reviewable site proposal.",
"verification": [
"Call app_topolo_web.sites.agent_sessions.get and confirm the returned pending proposal matches the instruction."
],
"recovery": [
"503 dependency_unavailable: Keep the current session, wait for the proposal dependency to recover, then send a new instruction once."
],
"docs_url": "https://docs.topolo.app/applications/web#agent-editing",
"resource": {
"kind": "agent_proposal",
"idPath": "proposals.0.id"
},
"next_action_ids": [
"app_topolo_web.sites.agent_sessions.proposals.apply",
"app_topolo_web.sites.agent_sessions.proposals.reject"
],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/agent/sessions/*/messages",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.agent_sessions.proposals.apply",
"title": "Sites Agent Sessions Proposals Apply",
"description": "Call POST /studio/sites/{siteId}/agent/sessions/{sessionId}/proposals/{proposalId}/apply.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/agent/sessions/{sessionId}/proposals/{proposalId}/apply",
"permission": "studio:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"sessionId": {
"type": "string",
"minLength": 1
},
"proposalId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId",
"sessionId",
"proposalId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Agent Sessions Proposals Apply.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"sessionId": "example",
"proposalId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/agent/sessions/example/proposals/example/apply",
"body": {
"siteId": "example",
"sessionId": "example",
"proposalId": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/agent/sessions/{sessionId}/proposals/{proposalId}/apply. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/agent/sessions/*/proposals/*/apply",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.agent_sessions.proposals.reject",
"title": "Sites Agent Sessions Proposals Reject",
"description": "Call POST /studio/sites/{siteId}/agent/sessions/{sessionId}/proposals/{proposalId}/reject.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/agent/sessions/{sessionId}/proposals/{proposalId}/reject",
"permission": "studio:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"sessionId": {
"type": "string",
"minLength": 1
},
"proposalId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId",
"sessionId",
"proposalId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Agent Sessions Proposals Reject.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"sessionId": "example",
"proposalId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/agent/sessions/example/proposals/example/reject",
"body": {
"siteId": "example",
"sessionId": "example",
"proposalId": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/agent/sessions/{sessionId}/proposals/{proposalId}/reject. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/agent/sessions/*/proposals/*/reject",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.generate",
"title": "Sites Generate",
"description": "Call POST /studio/sites/{siteId}/generate.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/generate",
"permission": "studio:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"intent": {
"type": "string",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessName": {
"type": "string",
"minLength": 1
},
"businessType": {
"type": "string",
"minLength": 1
},
"location": {
"type": "string",
"minLength": 1
},
"audience": {
"type": "string",
"minLength": 1
},
"offer": {
"type": "string",
"minLength": 1
},
"tone": {
"type": "string",
"minLength": 1
},
"differentiators": {
"type": "array",
"items": {
"type": "string"
}
},
"goals": {
"type": "array",
"items": {
"type": "string"
}
},
"prompt": {
"type": "string",
"minLength": 1
},
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Generate.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/generate",
"body": {
"siteId": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/generate. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/generate",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.document_nodes.regenerate",
"title": "Sites Document Nodes Regenerate",
"description": "Call POST /studio/sites/{siteId}/document/nodes/{nodeId}/regenerate.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/document/nodes/{nodeId}/regenerate",
"permission": "studio:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"nodeId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId",
"nodeId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Document Nodes Regenerate.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"nodeId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/document/nodes/example/regenerate",
"body": {
"siteId": "example",
"nodeId": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/document/nodes/{nodeId}/regenerate. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/document/nodes/*/regenerate",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.publish",
"title": "Sites Publish",
"description": "Call POST /studio/sites/{siteId}/publish.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/publish",
"permission": "publish:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Publish TopoloWeb site",
"type": "object",
"description": "Publish one quality-approved site as a new immutable active version.",
"properties": {
"siteId": {
"type": "string",
"description": "Site identifier returned by sites.build or site discovery.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional human-readable version label.",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Published site, immutable version, quality evidence, and verification URLs.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"version": {
"$ref": "#/$defs/siteVersion"
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"urls": {
"$ref": "#/$defs/siteUrls"
}
},
"required": [
"site",
"version",
"qualityReport",
"urls"
],
"additionalProperties": false,
"$defs": {
"jsonValue": {
"description": "A JSON-compatible component property value.",
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/jsonValue"
}
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
}
]
},
"actionLink": {
"type": "object",
"description": "A rendered call-to-action link.",
"properties": {
"label": {
"type": "string",
"description": "Visible link label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, mailto, tel, or HTTPS URL.",
"minLength": 1
},
"linkKind": {
"type": "string",
"description": "Whether the link targets a TopoloWeb page or a custom URL.",
"enum": [
"custom",
"page"
]
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"label",
"href"
],
"additionalProperties": false
},
"navigationItem": {
"type": "object",
"description": "One site navigation entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable navigation item identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Visible navigation label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, or external URL.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Navigation emphasis.",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"description": "Optional parent item identifier for one-level menus."
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
},
"navigationMenu": {
"type": "object",
"description": "A named reusable navigation menu.",
"properties": {
"id": {
"type": "string",
"description": "Stable menu identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable menu name.",
"minLength": 1
},
"placement": {
"type": "string",
"description": "Custom menu placement marker.",
"const": "custom"
},
"items": {
"type": "array",
"description": "Ordered menu entries.",
"items": {
"$ref": "#/$defs/navigationItem"
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
},
"pageStyleDefaultsBase": {
"type": "object",
"description": "Site-wide default layout and typography values.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
}
},
"additionalProperties": false
},
"pageStyleDefaults": {
"type": "object",
"description": "Desktop page defaults with optional viewport overrides.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
},
"responsive": {
"type": "object",
"description": "Viewport-specific page-default overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/pageStyleDefaultsBase"
}
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"description": "Complete TopoloWeb theme and responsive page defaults.",
"properties": {
"primary": {
"type": "string",
"description": "Primary brand color.",
"minLength": 1
},
"secondary": {
"type": "string",
"description": "Secondary brand color.",
"minLength": 1
},
"surface": {
"type": "string",
"description": "Primary surface color.",
"minLength": 1
},
"ink": {
"type": "string",
"description": "Primary text color.",
"minLength": 1
},
"muted": {
"type": "string",
"description": "Muted text color.",
"minLength": 1
},
"accent": {
"type": "string",
"description": "Accent color.",
"minLength": 1
},
"accentSoft": {
"type": "string",
"description": "Soft accent surface color.",
"minLength": 1
},
"glow": {
"type": "string",
"description": "Decorative glow color.",
"minLength": 1
},
"headingFont": {
"type": "string",
"description": "CSS heading font stack.",
"minLength": 1
},
"bodyFont": {
"type": "string",
"description": "CSS body font stack.",
"minLength": 1
},
"radius": {
"type": "string",
"description": "Default CSS corner radius.",
"minLength": 1
},
"brandLogoUrl": {
"type": "string",
"description": "HTTPS brand-logo URL."
},
"brandLogoAlt": {
"type": "string",
"description": "Accessible brand-logo description."
},
"brandLogoWidth": {
"type": "string",
"description": "CSS brand-logo width."
},
"brandLogoHeight": {
"type": "string",
"description": "CSS brand-logo height."
},
"pageDefaults": {
"$ref": "#/$defs/pageStyleDefaults"
},
"customCss": {
"type": "string",
"description": "Reviewed site-wide CSS loaded after generated styles."
}
},
"required": [
"primary",
"secondary",
"surface",
"ink",
"muted",
"accent",
"accentSoft",
"glow",
"headingFont",
"bodyFont",
"radius"
],
"additionalProperties": false
},
"sectionStyleBase": {
"type": "object",
"description": "Desktop section style values.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
}
},
"additionalProperties": false
},
"sectionStyle": {
"type": "object",
"description": "Section style values with optional responsive overrides.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
},
"responsive": {
"type": "object",
"description": "Viewport-specific section-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItemStyleBase": {
"type": "object",
"description": "Desktop repeated-item style values.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
}
},
"additionalProperties": false
},
"sectionItemStyle": {
"type": "object",
"description": "Repeated-item style values with optional responsive overrides.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
},
"responsive": {
"type": "object",
"description": "Viewport-specific item-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionItemStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItem": {
"type": "object",
"description": "One repeated card, row, quote, metric, question, or media item.",
"properties": {
"id": {
"type": "string",
"description": "Stable item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title."
},
"body": {
"type": "string",
"description": "Visible supporting copy."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional value or price."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
},
"styleClassIds": {
"type": "array",
"description": "Reusable item style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"sectionValue": {
"type": "object",
"description": "Renderer-backed block content without persisted child arrays.",
"properties": {
"id": {
"type": "string",
"description": "Stable section identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"eyebrow": {
"type": "string",
"description": "Optional eyebrow copy."
},
"title": {
"type": "string",
"description": "Visible section heading."
},
"body": {
"type": "string",
"description": "Visible section body copy."
},
"kicker": {
"type": "string",
"description": "Optional supporting kicker."
},
"primaryAction": {
"$ref": "#/$defs/actionLink"
},
"secondaryAction": {
"$ref": "#/$defs/actionLink"
},
"imageUrl": {
"type": "string",
"description": "Optional section image URL."
},
"alt": {
"type": "string",
"description": "Accessible section-image description."
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"styleClassIds": {
"type": "array",
"description": "Reusable section style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
},
"style": {
"$ref": "#/$defs/sectionStyle"
},
"formId": {
"type": "string",
"description": "Form identifier for a contact-form block."
},
"collectionSlug": {
"type": "string",
"description": "Collection slug bound to this block."
},
"collectionLimit": {
"type": "number",
"description": "Maximum collection entries rendered.",
"minimum": 1
},
"collectionSort": {
"type": "string",
"description": "Collection sorting behavior.",
"enum": [
"manual",
"title_asc",
"title_desc",
"meta_asc",
"meta_desc"
]
},
"html": {
"type": "string",
"description": "Reviewed HTML for embed-capable blocks."
},
"videoUrl": {
"type": "string",
"description": "Direct, YouTube, or Vimeo video URL."
},
"videoProvider": {
"type": "string",
"description": "Video provider.",
"enum": [
"direct",
"youtube",
"vimeo"
]
},
"videoPosterUrl": {
"type": "string",
"description": "Video poster image URL."
},
"videoAutoplay": {
"type": "boolean",
"description": "Autoplay video when allowed."
},
"videoControls": {
"type": "boolean",
"description": "Show native video controls."
},
"videoMuted": {
"type": "boolean",
"description": "Mute video playback."
},
"componentName": {
"type": "string",
"description": "Approved custom component name."
},
"componentProps": {
"type": "object",
"description": "Component-specific reviewed JSON properties.",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
},
"menuId": {
"type": "string",
"description": "Reusable menu identifier bound to a menu block."
}
},
"required": [
"id",
"kind",
"title",
"body"
],
"additionalProperties": false
},
"pageValue": {
"type": "object",
"description": "Persisted page metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable page identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Root-relative page slug beginning with /.",
"pattern": "^/"
},
"title": {
"type": "string",
"description": "Visible page heading and title-template input.",
"minLength": 1
},
"description": {
"type": "string",
"description": "Page search and social description."
}
},
"required": [
"id",
"slug",
"title",
"description"
],
"additionalProperties": false
},
"columnValue": {
"type": "object",
"description": "Persisted layout-column metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable column identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional editor label."
},
"span": {
"type": "number",
"description": "Grid span.",
"minimum": 1
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Original product-domain identity for a document node.",
"properties": {
"kind": {
"type": "string",
"description": "Source record kind.",
"enum": [
"page",
"section",
"column",
"item"
]
},
"id": {
"type": "string",
"description": "Source record identifier.",
"minLength": 1
}
},
"required": [
"kind",
"id"
],
"additionalProperties": false
},
"pageNode": {
"type": "object",
"description": "A canonical page node owning exactly one page-body slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "page"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Parent node identifier when nested."
},
"source": {
"$ref": "#/$defs/source"
},
"value": {
"$ref": "#/$defs/pageValue"
},
"children": {
"type": "array",
"description": "Exactly one page-body slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"value",
"children"
],
"additionalProperties": false
},
"slotNode": {
"type": "object",
"description": "A canonical child slot controlling accepted node kinds.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "slot"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning page, layout, or block node identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"slotKind": {
"type": "string",
"description": "Child-slot role.",
"enum": [
"page-body",
"layout-column",
"block-items"
]
},
"accepts": {
"type": "array",
"description": "Document node kinds allowed in this slot.",
"items": {
"type": "string",
"description": "One allowed node kind.",
"enum": [
"layout",
"block",
"item"
]
}
},
"parentSectionId": {
"type": "string",
"description": "Owning section identifier for layout and block slots."
},
"columnId": {
"type": "string",
"description": "Column identifier for layout-column slots."
},
"value": {
"$ref": "#/$defs/columnValue"
},
"children": {
"type": "array",
"description": "Canonical child nodes.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"slotKind",
"accepts",
"children"
],
"additionalProperties": false
},
"layoutNode": {
"type": "object",
"description": "A canonical layout block owning one or more layout-column slots.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "layout"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"layoutKind": {
"type": "string",
"description": "Layout behavior.",
"enum": [
"container",
"grid",
"stack",
"flex-row",
"columns"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Layout-column slots.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"layoutKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"blockNode": {
"type": "object",
"description": "A canonical renderer block with optional block-items slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "block"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"blockKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Optional block-items slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"blockKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"itemNode": {
"type": "object",
"description": "A canonical repeated-item leaf node.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "item"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning block-items slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"parentSectionId": {
"type": "string",
"description": "Owning block section identifier.",
"minLength": 1
},
"itemId": {
"type": "string",
"description": "Persisted item identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionItem"
},
"children": {
"type": "array",
"description": "Item nodes are leaves and must have no children.",
"maxItems": 0
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"parentSectionId",
"itemId",
"value",
"children"
],
"additionalProperties": false
},
"siteDocumentNode": {
"description": "One canonical TopoloWeb document node.",
"oneOf": [
{
"$ref": "#/$defs/pageNode"
},
{
"$ref": "#/$defs/slotNode"
},
{
"$ref": "#/$defs/layoutNode"
},
{
"$ref": "#/$defs/blockNode"
},
{
"$ref": "#/$defs/itemNode"
}
]
},
"siteDocument": {
"type": "object",
"description": "Canonical versioned TopoloWeb document tree.",
"properties": {
"version": {
"type": "integer",
"description": "Document schema version.",
"const": 1
},
"pages": {
"type": "array",
"description": "Canonical page nodes.",
"items": {
"$ref": "#/$defs/pageNode"
}
}
},
"required": [
"version",
"pages"
],
"additionalProperties": false
},
"styleClass": {
"description": "A reusable section or item style class.",
"oneOf": [
{
"type": "object",
"description": "Reusable section style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "section"
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Reusable repeated-item style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "item"
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
},
"collectionItem": {
"type": "object",
"description": "One reusable CMS collection entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection-item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title.",
"minLength": 1
},
"body": {
"type": "string",
"description": "Visible item body."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional price or value."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"collection": {
"type": "object",
"description": "Reusable CMS collection.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Stable collection slug.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Collection content kind.",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"description": "Human-readable collection label.",
"minLength": 1
},
"items": {
"type": "array",
"description": "Ordered collection entries.",
"items": {
"$ref": "#/$defs/collectionItem"
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
},
"codeSnippet": {
"type": "object",
"description": "Reviewed bounded code injection.",
"properties": {
"id": {
"type": "string",
"description": "Stable snippet identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable snippet label.",
"minLength": 1
},
"slot": {
"type": "string",
"description": "Injection slot.",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string",
"description": "Reviewed HTML, CSS, or JavaScript source."
},
"enabled": {
"type": "boolean",
"description": "Whether this snippet is active."
}
},
"required": [
"id",
"label",
"slot",
"code",
"enabled"
],
"additionalProperties": false
},
"seo": {
"type": "object",
"description": "Site-wide search and social metadata defaults.",
"properties": {
"titleTemplate": {
"type": "string",
"description": "Title template; %s is replaced by the page title."
},
"metaTitle": {
"type": "string",
"description": "Default page title override."
},
"metaDescription": {
"type": "string",
"description": "Default search and social description."
},
"faviconUrl": {
"type": "string",
"description": "Browser and bookmark icon URL."
},
"openGraphImageUrl": {
"type": "string",
"description": "Default Open Graph image URL."
},
"canonicalUrl": {
"type": "string",
"description": "Canonical site URL."
}
},
"additionalProperties": false
},
"siteContent": {
"type": "object",
"description": "Complete canonical TopoloWeb site content.",
"properties": {
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"siteTitle": {
"type": "string",
"description": "Public site title.",
"minLength": 1
},
"siteDescription": {
"type": "string",
"description": "Public site description."
},
"contactEmail": {
"type": "string",
"description": "Public contact email.",
"minLength": 1
},
"contactPhone": {
"type": "string",
"description": "Optional public contact phone number."
},
"navigation": {
"type": "array",
"description": "Primary site navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"footerNavigation": {
"type": "array",
"description": "Footer navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"menus": {
"type": "array",
"description": "Reusable custom menus.",
"items": {
"$ref": "#/$defs/navigationMenu"
}
},
"styleClasses": {
"type": "array",
"description": "Reusable section and item styles.",
"items": {
"$ref": "#/$defs/styleClass"
}
},
"theme": {
"$ref": "#/$defs/theme"
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"description": "Reusable CMS collections.",
"items": {
"$ref": "#/$defs/collection"
}
},
"codeSnippets": {
"type": "array",
"description": "Reviewed bounded code snippets.",
"items": {
"$ref": "#/$defs/codeSnippet"
}
},
"seo": {
"$ref": "#/$defs/seo"
}
},
"required": [
"intent",
"siteTitle",
"siteDescription",
"contactEmail",
"navigation",
"footerNavigation",
"menus",
"styleClasses",
"theme",
"document",
"collections",
"codeSnippets"
],
"additionalProperties": false
},
"createSite": {
"type": "object",
"description": "Brief used to create a new TopoloWeb site.",
"properties": {
"name": {
"type": "string",
"description": "Internal and initial public site name.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"description": "Business or project category.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Primary intended audience.",
"minLength": 1
},
"offer": {
"type": "string",
"description": "Primary product, service, or proposition.",
"minLength": 1
},
"tone": {
"type": "string",
"description": "Desired writing and visual tone.",
"minLength": 1
},
"location": {
"type": "string",
"description": "Optional geographic market."
},
"differentiators": {
"type": "array",
"description": "Specific differentiators to communicate.",
"items": {
"type": "string",
"description": "One differentiator."
}
},
"goals": {
"type": "array",
"description": "Desired user and business outcomes.",
"items": {
"type": "string",
"description": "One goal."
}
},
"prompt": {
"type": "string",
"description": "Additional generation direction."
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"qualityIssue": {
"type": "object",
"description": "One actionable launch-quality finding.",
"properties": {
"id": {
"type": "string",
"description": "Stable issue code.",
"minLength": 1
},
"severity": {
"type": "string",
"description": "Issue severity.",
"enum": [
"info",
"warning",
"error"
]
},
"title": {
"type": "string",
"description": "Short issue title.",
"minLength": 1
},
"detail": {
"type": "string",
"description": "Actionable remediation detail.",
"minLength": 1
}
},
"required": [
"id",
"severity",
"title",
"detail"
],
"additionalProperties": false
},
"qualityReport": {
"type": "object",
"description": "Deterministic content and launch-quality report.",
"properties": {
"generatedAt": {
"type": "string",
"description": "ISO-8601 generation timestamp.",
"format": "date-time"
},
"score": {
"type": "number",
"description": "Quality score from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"description": "Actionable quality findings.",
"items": {
"$ref": "#/$defs/qualityIssue"
}
}
},
"required": [
"generatedAt",
"score",
"issues"
],
"additionalProperties": false
},
"siteRecord": {
"type": "object",
"description": "One TopoloWeb site and its current editable content.",
"properties": {
"id": {
"type": "string",
"description": "Stable site identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Platform hostname slug.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Internal site name.",
"minLength": 1
},
"status": {
"type": "string",
"description": "Current lifecycle status.",
"enum": [
"draft",
"published",
"archived"
]
},
"brief": {
"type": "object",
"description": "Generation brief retained for iterative edits.",
"additionalProperties": true
},
"draftContent": {
"$ref": "#/$defs/siteContent"
},
"currentVersionId": {
"type": "string",
"description": "Currently published immutable version identifier."
},
"draftPreviewToken": {
"type": "string",
"description": "Opaque token used by the draft preview URL.",
"minLength": 1
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"slug",
"name",
"status",
"brief",
"draftContent",
"draftPreviewToken",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteVersion": {
"type": "object",
"description": "One immutable published site version.",
"properties": {
"id": {
"type": "string",
"description": "Stable version identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"versionNumber": {
"type": "integer",
"description": "Monotonic site version number.",
"minimum": 1
},
"label": {
"type": "string",
"description": "Human-readable version label.",
"minLength": 1
},
"snapshot": {
"$ref": "#/$defs/siteContent"
},
"previewToken": {
"type": "string",
"description": "Opaque immutable-version preview token.",
"minLength": 1
},
"publishedAt": {
"type": "string",
"description": "ISO-8601 publication timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"versionNumber",
"label",
"snapshot",
"previewToken",
"publishedAt"
],
"additionalProperties": false
},
"siteDomain": {
"type": "object",
"description": "One platform or custom site domain.",
"properties": {
"id": {
"type": "string",
"description": "Stable domain identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"hostname": {
"type": "string",
"description": "Domain hostname without scheme.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Domain ownership kind.",
"enum": [
"platform",
"custom"
]
},
"status": {
"type": "string",
"description": "DNS and TLS activation status.",
"enum": [
"pending_dns",
"pending_ssl",
"active",
"failed"
]
},
"dnsTarget": {
"type": "string",
"description": "DNS target required for this domain.",
"minLength": 1
},
"verificationToken": {
"type": "string",
"description": "Opaque DNS ownership verification token.",
"minLength": 1
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the primary public hostname."
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"hostname",
"kind",
"status",
"dnsTarget",
"verificationToken",
"isPrimary",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteUrls": {
"type": "object",
"description": "Stable URLs used to preview and verify the site.",
"properties": {
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public site URL.",
"format": "uri"
}
},
"required": [
"previewUrl",
"publicUrl"
],
"additionalProperties": false
},
"siteDetails": {
"type": "object",
"description": "Complete editable site state returned after a build.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One site form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions"
],
"additionalProperties": false
}
}
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/web#publish-and-recover",
"resource": {
"kind": "site",
"idPath": "site.id",
"versionPath": "version.id"
},
"effects": [
"Creates and activates one immutable published version."
],
"errors": [
{
"status": 422,
"code": "publish_blocked",
"recovery": "Resolve every error returned by sites.publish.preflight."
}
],
"verify": [
"Open urls.publicUrl and confirm the returned version.id is active."
],
"rollbackActionId": "app_topolo_web.sites.versions.restore",
"nextActionIds": [
"app_topolo_web.sites.versions.list"
],
"examples": [
{
"title": "Publish a quality-approved site",
"description": "Use the site id returned by sites.build after sites.publish.preflight reports canPublish=true.",
"input": {
"siteId": "site_example",
"label": "Launch"
}
}
]
},
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "site_example",
"label": "Launch"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/site_example/publish",
"body": {
"siteId": "site_example",
"label": "Launch"
}
},
"effects": "Creates and activates one immutable published version.",
"verification": [
"Open urls.publicUrl and confirm the returned version.id is active."
],
"recovery": [
"422 publish_blocked: Resolve every error returned by sites.publish.preflight."
],
"docs_url": "https://docs.topolo.app/applications/web#publish-and-recover",
"resource": {
"kind": "site",
"idPath": "site.id",
"versionPath": "version.id"
},
"next_action_ids": [
"app_topolo_web.sites.versions.list"
],
"rollback_action_id": "app_topolo_web.sites.versions.restore"
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/publish",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.domains.create",
"title": "Sites Domains Create",
"description": "Call POST /studio/sites/{siteId}/domains.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/domains",
"permission": "domains:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"hostname": {
"type": "string",
"minLength": 1
},
"kind": {
"type": "string",
"enum": [
"platform",
"custom"
]
},
"isPrimary": {
"type": "boolean"
}
},
"required": [
"siteId",
"hostname",
"kind"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Domains Create.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"hostname": "example",
"kind": "platform"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/domains",
"body": {
"siteId": "example",
"hostname": "example",
"kind": "platform"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/domains. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/domains",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.domains.verify",
"title": "Sites Domains Verify",
"description": "Call POST /studio/sites/{siteId}/domains/{domainId}/verify.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/domains/{domainId}/verify",
"permission": "domains:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"domainId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId",
"domainId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Domains Verify.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"domainId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/domains/example/verify",
"body": {
"siteId": "example",
"domainId": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/domains/{domainId}/verify. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/domains/*/verify",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.domains.delete",
"title": "Delete site domain",
"description": "Delete one domain from a site.",
"permission": "domains:write",
"method": "DELETE",
"path": "/api/studio/sites/{siteId}/domains/{domainId}",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"domainId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId",
"domainId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"domainId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/studio/sites/example/domains/example",
"body": null
},
"effects": "May change state through DELETE /api/studio/sites/{siteId}/domains/{domainId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/studio/sites/*/domains/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.assets.create",
"title": "Sites Assets Create",
"description": "Call POST /studio/sites/{siteId}/assets.",
"method": "POST",
"path": "/api/studio/sites/{siteId}/assets",
"permission": "assets:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"label": {
"type": "string",
"minLength": 1
},
"kind": {
"type": "string",
"enum": [
"favicon",
"logo",
"hero",
"gallery",
"proof",
"poster",
"video"
]
},
"url": {
"type": "string",
"minLength": 1
},
"alt": {
"type": "string"
}
},
"required": [
"siteId",
"label",
"kind",
"url",
"alt"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Assets Create.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"label": "example",
"kind": "favicon",
"url": "https://example.com",
"alt": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/assets",
"body": {
"siteId": "example",
"label": "example",
"kind": "favicon",
"url": "https://example.com",
"alt": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/assets. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/assets",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.assets.upload",
"title": "Upload site asset",
"description": "Upload a base64-encoded image or video asset to one site.",
"permission": "assets:write",
"method": "POST",
"path": "/api/studio/sites/{siteId}/assets/upload",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"label": {
"type": "string",
"minLength": 1
},
"kind": {
"type": "string",
"enum": [
"favicon",
"logo",
"hero",
"gallery",
"proof",
"poster",
"video"
]
},
"fileName": {
"type": "string",
"minLength": 1
},
"contentType": {
"type": "string",
"minLength": 1
},
"dataBase64": {
"type": "string",
"minLength": 1
},
"alt": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId",
"label",
"kind",
"fileName",
"contentType",
"dataBase64",
"alt"
],
"additionalProperties": false
},
"agentContract": {
"upload": {
"profile": "inline-base64",
"contentField": "dataBase64",
"contentTypeField": "contentType",
"fileNameField": "fileName",
"maxBytes": 16777216,
"acceptedContentTypes": [
"image/jpeg",
"image/png",
"image/webp",
"image/gif",
"image/svg+xml",
"video/mp4",
"video/webm",
"video/ogg"
]
}
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"label": "example",
"kind": "favicon",
"fileName": "example",
"contentType": "example",
"dataBase64": "example",
"alt": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/example/assets/upload",
"body": {
"siteId": "example",
"label": "example",
"kind": "favicon",
"fileName": "example",
"contentType": "example",
"dataBase64": "example",
"alt": "example"
}
},
"effects": "May change state through POST /api/studio/sites/{siteId}/assets/upload. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/assets/upload",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "widget.get",
"title": "Get widget summary",
"description": "Get the TopoloOne widget summary for this service.",
"method": "GET",
"path": "/api/widget",
"permission": "runtime:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/widget",
"body": null
},
"effects": "Reads state through GET /api/widget without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/widget",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.list",
"title": "Sites List",
"description": "Call GET /studio/sites.",
"method": "GET",
"path": "/api/studio/sites",
"permission": "studio:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites List.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites",
"body": null
},
"effects": "Reads state through GET /api/studio/sites without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.get",
"title": "Sites Get",
"description": "Call GET /studio/sites/{siteId}.",
"method": "GET",
"path": "/api/studio/sites/{siteId}",
"permission": "studio:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Get.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId} without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.quality.get",
"title": "Get site quality",
"description": "Get deterministic content and launch-quality findings for one site.",
"permission": "studio:read",
"method": "GET",
"path": "/api/studio/sites/{siteId}/quality",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/$defs/qualityReport",
"$defs": {
"jsonValue": {
"description": "A JSON-compatible component property value.",
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/jsonValue"
}
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
}
]
},
"actionLink": {
"type": "object",
"description": "A rendered call-to-action link.",
"properties": {
"label": {
"type": "string",
"description": "Visible link label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, mailto, tel, or HTTPS URL.",
"minLength": 1
},
"linkKind": {
"type": "string",
"description": "Whether the link targets a TopoloWeb page or a custom URL.",
"enum": [
"custom",
"page"
]
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"label",
"href"
],
"additionalProperties": false
},
"navigationItem": {
"type": "object",
"description": "One site navigation entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable navigation item identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Visible navigation label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, or external URL.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Navigation emphasis.",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"description": "Optional parent item identifier for one-level menus."
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
},
"navigationMenu": {
"type": "object",
"description": "A named reusable navigation menu.",
"properties": {
"id": {
"type": "string",
"description": "Stable menu identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable menu name.",
"minLength": 1
},
"placement": {
"type": "string",
"description": "Custom menu placement marker.",
"const": "custom"
},
"items": {
"type": "array",
"description": "Ordered menu entries.",
"items": {
"$ref": "#/$defs/navigationItem"
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
},
"pageStyleDefaultsBase": {
"type": "object",
"description": "Site-wide default layout and typography values.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
}
},
"additionalProperties": false
},
"pageStyleDefaults": {
"type": "object",
"description": "Desktop page defaults with optional viewport overrides.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
},
"responsive": {
"type": "object",
"description": "Viewport-specific page-default overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/pageStyleDefaultsBase"
}
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"description": "Complete TopoloWeb theme and responsive page defaults.",
"properties": {
"primary": {
"type": "string",
"description": "Primary brand color.",
"minLength": 1
},
"secondary": {
"type": "string",
"description": "Secondary brand color.",
"minLength": 1
},
"surface": {
"type": "string",
"description": "Primary surface color.",
"minLength": 1
},
"ink": {
"type": "string",
"description": "Primary text color.",
"minLength": 1
},
"muted": {
"type": "string",
"description": "Muted text color.",
"minLength": 1
},
"accent": {
"type": "string",
"description": "Accent color.",
"minLength": 1
},
"accentSoft": {
"type": "string",
"description": "Soft accent surface color.",
"minLength": 1
},
"glow": {
"type": "string",
"description": "Decorative glow color.",
"minLength": 1
},
"headingFont": {
"type": "string",
"description": "CSS heading font stack.",
"minLength": 1
},
"bodyFont": {
"type": "string",
"description": "CSS body font stack.",
"minLength": 1
},
"radius": {
"type": "string",
"description": "Default CSS corner radius.",
"minLength": 1
},
"brandLogoUrl": {
"type": "string",
"description": "HTTPS brand-logo URL."
},
"brandLogoAlt": {
"type": "string",
"description": "Accessible brand-logo description."
},
"brandLogoWidth": {
"type": "string",
"description": "CSS brand-logo width."
},
"brandLogoHeight": {
"type": "string",
"description": "CSS brand-logo height."
},
"pageDefaults": {
"$ref": "#/$defs/pageStyleDefaults"
},
"customCss": {
"type": "string",
"description": "Reviewed site-wide CSS loaded after generated styles."
}
},
"required": [
"primary",
"secondary",
"surface",
"ink",
"muted",
"accent",
"accentSoft",
"glow",
"headingFont",
"bodyFont",
"radius"
],
"additionalProperties": false
},
"sectionStyleBase": {
"type": "object",
"description": "Desktop section style values.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
}
},
"additionalProperties": false
},
"sectionStyle": {
"type": "object",
"description": "Section style values with optional responsive overrides.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
},
"responsive": {
"type": "object",
"description": "Viewport-specific section-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItemStyleBase": {
"type": "object",
"description": "Desktop repeated-item style values.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
}
},
"additionalProperties": false
},
"sectionItemStyle": {
"type": "object",
"description": "Repeated-item style values with optional responsive overrides.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
},
"responsive": {
"type": "object",
"description": "Viewport-specific item-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionItemStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItem": {
"type": "object",
"description": "One repeated card, row, quote, metric, question, or media item.",
"properties": {
"id": {
"type": "string",
"description": "Stable item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title."
},
"body": {
"type": "string",
"description": "Visible supporting copy."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional value or price."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
},
"styleClassIds": {
"type": "array",
"description": "Reusable item style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"sectionValue": {
"type": "object",
"description": "Renderer-backed block content without persisted child arrays.",
"properties": {
"id": {
"type": "string",
"description": "Stable section identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"eyebrow": {
"type": "string",
"description": "Optional eyebrow copy."
},
"title": {
"type": "string",
"description": "Visible section heading."
},
"body": {
"type": "string",
"description": "Visible section body copy."
},
"kicker": {
"type": "string",
"description": "Optional supporting kicker."
},
"primaryAction": {
"$ref": "#/$defs/actionLink"
},
"secondaryAction": {
"$ref": "#/$defs/actionLink"
},
"imageUrl": {
"type": "string",
"description": "Optional section image URL."
},
"alt": {
"type": "string",
"description": "Accessible section-image description."
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"styleClassIds": {
"type": "array",
"description": "Reusable section style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
},
"style": {
"$ref": "#/$defs/sectionStyle"
},
"formId": {
"type": "string",
"description": "Form identifier for a contact-form block."
},
"collectionSlug": {
"type": "string",
"description": "Collection slug bound to this block."
},
"collectionLimit": {
"type": "number",
"description": "Maximum collection entries rendered.",
"minimum": 1
},
"collectionSort": {
"type": "string",
"description": "Collection sorting behavior.",
"enum": [
"manual",
"title_asc",
"title_desc",
"meta_asc",
"meta_desc"
]
},
"html": {
"type": "string",
"description": "Reviewed HTML for embed-capable blocks."
},
"videoUrl": {
"type": "string",
"description": "Direct, YouTube, or Vimeo video URL."
},
"videoProvider": {
"type": "string",
"description": "Video provider.",
"enum": [
"direct",
"youtube",
"vimeo"
]
},
"videoPosterUrl": {
"type": "string",
"description": "Video poster image URL."
},
"videoAutoplay": {
"type": "boolean",
"description": "Autoplay video when allowed."
},
"videoControls": {
"type": "boolean",
"description": "Show native video controls."
},
"videoMuted": {
"type": "boolean",
"description": "Mute video playback."
},
"componentName": {
"type": "string",
"description": "Approved custom component name."
},
"componentProps": {
"type": "object",
"description": "Component-specific reviewed JSON properties.",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
},
"menuId": {
"type": "string",
"description": "Reusable menu identifier bound to a menu block."
}
},
"required": [
"id",
"kind",
"title",
"body"
],
"additionalProperties": false
},
"pageValue": {
"type": "object",
"description": "Persisted page metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable page identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Root-relative page slug beginning with /.",
"pattern": "^/"
},
"title": {
"type": "string",
"description": "Visible page heading and title-template input.",
"minLength": 1
},
"description": {
"type": "string",
"description": "Page search and social description."
}
},
"required": [
"id",
"slug",
"title",
"description"
],
"additionalProperties": false
},
"columnValue": {
"type": "object",
"description": "Persisted layout-column metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable column identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional editor label."
},
"span": {
"type": "number",
"description": "Grid span.",
"minimum": 1
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Original product-domain identity for a document node.",
"properties": {
"kind": {
"type": "string",
"description": "Source record kind.",
"enum": [
"page",
"section",
"column",
"item"
]
},
"id": {
"type": "string",
"description": "Source record identifier.",
"minLength": 1
}
},
"required": [
"kind",
"id"
],
"additionalProperties": false
},
"pageNode": {
"type": "object",
"description": "A canonical page node owning exactly one page-body slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "page"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Parent node identifier when nested."
},
"source": {
"$ref": "#/$defs/source"
},
"value": {
"$ref": "#/$defs/pageValue"
},
"children": {
"type": "array",
"description": "Exactly one page-body slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"value",
"children"
],
"additionalProperties": false
},
"slotNode": {
"type": "object",
"description": "A canonical child slot controlling accepted node kinds.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "slot"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning page, layout, or block node identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"slotKind": {
"type": "string",
"description": "Child-slot role.",
"enum": [
"page-body",
"layout-column",
"block-items"
]
},
"accepts": {
"type": "array",
"description": "Document node kinds allowed in this slot.",
"items": {
"type": "string",
"description": "One allowed node kind.",
"enum": [
"layout",
"block",
"item"
]
}
},
"parentSectionId": {
"type": "string",
"description": "Owning section identifier for layout and block slots."
},
"columnId": {
"type": "string",
"description": "Column identifier for layout-column slots."
},
"value": {
"$ref": "#/$defs/columnValue"
},
"children": {
"type": "array",
"description": "Canonical child nodes.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"slotKind",
"accepts",
"children"
],
"additionalProperties": false
},
"layoutNode": {
"type": "object",
"description": "A canonical layout block owning one or more layout-column slots.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "layout"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"layoutKind": {
"type": "string",
"description": "Layout behavior.",
"enum": [
"container",
"grid",
"stack",
"flex-row",
"columns"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Layout-column slots.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"layoutKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"blockNode": {
"type": "object",
"description": "A canonical renderer block with optional block-items slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "block"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"blockKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Optional block-items slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"blockKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"itemNode": {
"type": "object",
"description": "A canonical repeated-item leaf node.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "item"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning block-items slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"parentSectionId": {
"type": "string",
"description": "Owning block section identifier.",
"minLength": 1
},
"itemId": {
"type": "string",
"description": "Persisted item identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionItem"
},
"children": {
"type": "array",
"description": "Item nodes are leaves and must have no children.",
"maxItems": 0
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"parentSectionId",
"itemId",
"value",
"children"
],
"additionalProperties": false
},
"siteDocumentNode": {
"description": "One canonical TopoloWeb document node.",
"oneOf": [
{
"$ref": "#/$defs/pageNode"
},
{
"$ref": "#/$defs/slotNode"
},
{
"$ref": "#/$defs/layoutNode"
},
{
"$ref": "#/$defs/blockNode"
},
{
"$ref": "#/$defs/itemNode"
}
]
},
"siteDocument": {
"type": "object",
"description": "Canonical versioned TopoloWeb document tree.",
"properties": {
"version": {
"type": "integer",
"description": "Document schema version.",
"const": 1
},
"pages": {
"type": "array",
"description": "Canonical page nodes.",
"items": {
"$ref": "#/$defs/pageNode"
}
}
},
"required": [
"version",
"pages"
],
"additionalProperties": false
},
"styleClass": {
"description": "A reusable section or item style class.",
"oneOf": [
{
"type": "object",
"description": "Reusable section style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "section"
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Reusable repeated-item style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "item"
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
},
"collectionItem": {
"type": "object",
"description": "One reusable CMS collection entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection-item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title.",
"minLength": 1
},
"body": {
"type": "string",
"description": "Visible item body."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional price or value."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"collection": {
"type": "object",
"description": "Reusable CMS collection.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Stable collection slug.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Collection content kind.",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"description": "Human-readable collection label.",
"minLength": 1
},
"items": {
"type": "array",
"description": "Ordered collection entries.",
"items": {
"$ref": "#/$defs/collectionItem"
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
},
"codeSnippet": {
"type": "object",
"description": "Reviewed bounded code injection.",
"properties": {
"id": {
"type": "string",
"description": "Stable snippet identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable snippet label.",
"minLength": 1
},
"slot": {
"type": "string",
"description": "Injection slot.",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string",
"description": "Reviewed HTML, CSS, or JavaScript source."
},
"enabled": {
"type": "boolean",
"description": "Whether this snippet is active."
}
},
"required": [
"id",
"label",
"slot",
"code",
"enabled"
],
"additionalProperties": false
},
"seo": {
"type": "object",
"description": "Site-wide search and social metadata defaults.",
"properties": {
"titleTemplate": {
"type": "string",
"description": "Title template; %s is replaced by the page title."
},
"metaTitle": {
"type": "string",
"description": "Default page title override."
},
"metaDescription": {
"type": "string",
"description": "Default search and social description."
},
"faviconUrl": {
"type": "string",
"description": "Browser and bookmark icon URL."
},
"openGraphImageUrl": {
"type": "string",
"description": "Default Open Graph image URL."
},
"canonicalUrl": {
"type": "string",
"description": "Canonical site URL."
}
},
"additionalProperties": false
},
"siteContent": {
"type": "object",
"description": "Complete canonical TopoloWeb site content.",
"properties": {
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"siteTitle": {
"type": "string",
"description": "Public site title.",
"minLength": 1
},
"siteDescription": {
"type": "string",
"description": "Public site description."
},
"contactEmail": {
"type": "string",
"description": "Public contact email.",
"minLength": 1
},
"contactPhone": {
"type": "string",
"description": "Optional public contact phone number."
},
"navigation": {
"type": "array",
"description": "Primary site navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"footerNavigation": {
"type": "array",
"description": "Footer navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"menus": {
"type": "array",
"description": "Reusable custom menus.",
"items": {
"$ref": "#/$defs/navigationMenu"
}
},
"styleClasses": {
"type": "array",
"description": "Reusable section and item styles.",
"items": {
"$ref": "#/$defs/styleClass"
}
},
"theme": {
"$ref": "#/$defs/theme"
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"description": "Reusable CMS collections.",
"items": {
"$ref": "#/$defs/collection"
}
},
"codeSnippets": {
"type": "array",
"description": "Reviewed bounded code snippets.",
"items": {
"$ref": "#/$defs/codeSnippet"
}
},
"seo": {
"$ref": "#/$defs/seo"
}
},
"required": [
"intent",
"siteTitle",
"siteDescription",
"contactEmail",
"navigation",
"footerNavigation",
"menus",
"styleClasses",
"theme",
"document",
"collections",
"codeSnippets"
],
"additionalProperties": false
},
"createSite": {
"type": "object",
"description": "Brief used to create a new TopoloWeb site.",
"properties": {
"name": {
"type": "string",
"description": "Internal and initial public site name.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"description": "Business or project category.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Primary intended audience.",
"minLength": 1
},
"offer": {
"type": "string",
"description": "Primary product, service, or proposition.",
"minLength": 1
},
"tone": {
"type": "string",
"description": "Desired writing and visual tone.",
"minLength": 1
},
"location": {
"type": "string",
"description": "Optional geographic market."
},
"differentiators": {
"type": "array",
"description": "Specific differentiators to communicate.",
"items": {
"type": "string",
"description": "One differentiator."
}
},
"goals": {
"type": "array",
"description": "Desired user and business outcomes.",
"items": {
"type": "string",
"description": "One goal."
}
},
"prompt": {
"type": "string",
"description": "Additional generation direction."
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"qualityIssue": {
"type": "object",
"description": "One actionable launch-quality finding.",
"properties": {
"id": {
"type": "string",
"description": "Stable issue code.",
"minLength": 1
},
"severity": {
"type": "string",
"description": "Issue severity.",
"enum": [
"info",
"warning",
"error"
]
},
"title": {
"type": "string",
"description": "Short issue title.",
"minLength": 1
},
"detail": {
"type": "string",
"description": "Actionable remediation detail.",
"minLength": 1
}
},
"required": [
"id",
"severity",
"title",
"detail"
],
"additionalProperties": false
},
"qualityReport": {
"type": "object",
"description": "Deterministic content and launch-quality report.",
"properties": {
"generatedAt": {
"type": "string",
"description": "ISO-8601 generation timestamp.",
"format": "date-time"
},
"score": {
"type": "number",
"description": "Quality score from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"description": "Actionable quality findings.",
"items": {
"$ref": "#/$defs/qualityIssue"
}
}
},
"required": [
"generatedAt",
"score",
"issues"
],
"additionalProperties": false
},
"siteRecord": {
"type": "object",
"description": "One TopoloWeb site and its current editable content.",
"properties": {
"id": {
"type": "string",
"description": "Stable site identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Platform hostname slug.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Internal site name.",
"minLength": 1
},
"status": {
"type": "string",
"description": "Current lifecycle status.",
"enum": [
"draft",
"published",
"archived"
]
},
"brief": {
"type": "object",
"description": "Generation brief retained for iterative edits.",
"additionalProperties": true
},
"draftContent": {
"$ref": "#/$defs/siteContent"
},
"currentVersionId": {
"type": "string",
"description": "Currently published immutable version identifier."
},
"draftPreviewToken": {
"type": "string",
"description": "Opaque token used by the draft preview URL.",
"minLength": 1
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"slug",
"name",
"status",
"brief",
"draftContent",
"draftPreviewToken",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteVersion": {
"type": "object",
"description": "One immutable published site version.",
"properties": {
"id": {
"type": "string",
"description": "Stable version identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"versionNumber": {
"type": "integer",
"description": "Monotonic site version number.",
"minimum": 1
},
"label": {
"type": "string",
"description": "Human-readable version label.",
"minLength": 1
},
"snapshot": {
"$ref": "#/$defs/siteContent"
},
"previewToken": {
"type": "string",
"description": "Opaque immutable-version preview token.",
"minLength": 1
},
"publishedAt": {
"type": "string",
"description": "ISO-8601 publication timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"versionNumber",
"label",
"snapshot",
"previewToken",
"publishedAt"
],
"additionalProperties": false
},
"siteDomain": {
"type": "object",
"description": "One platform or custom site domain.",
"properties": {
"id": {
"type": "string",
"description": "Stable domain identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"hostname": {
"type": "string",
"description": "Domain hostname without scheme.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Domain ownership kind.",
"enum": [
"platform",
"custom"
]
},
"status": {
"type": "string",
"description": "DNS and TLS activation status.",
"enum": [
"pending_dns",
"pending_ssl",
"active",
"failed"
]
},
"dnsTarget": {
"type": "string",
"description": "DNS target required for this domain.",
"minLength": 1
},
"verificationToken": {
"type": "string",
"description": "Opaque DNS ownership verification token.",
"minLength": 1
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the primary public hostname."
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"hostname",
"kind",
"status",
"dnsTarget",
"verificationToken",
"isPrimary",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteUrls": {
"type": "object",
"description": "Stable URLs used to preview and verify the site.",
"properties": {
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public site URL.",
"format": "uri"
}
},
"required": [
"previewUrl",
"publicUrl"
],
"additionalProperties": false
},
"siteDetails": {
"type": "object",
"description": "Complete editable site state returned after a build.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One site form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions"
],
"additionalProperties": false
}
}
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example/quality",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId}/quality without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*/quality",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.preview.get",
"title": "Get site preview",
"description": "Get stable draft-preview and public URLs plus required responsive QA viewports.",
"permission": "studio:read",
"method": "GET",
"path": "/api/studio/sites/{siteId}/preview",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Stable draft preview coordinates.",
"properties": {
"siteId": {
"type": "string",
"description": "Site identifier.",
"minLength": 1
},
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public URL used after publication.",
"format": "uri"
},
"viewports": {
"type": "array",
"description": "Required responsive QA viewports.",
"items": {
"type": "object",
"description": "One required QA viewport.",
"properties": {
"id": {
"type": "string",
"description": "Viewport identifier.",
"enum": [
"mobile",
"tablet",
"desktop",
"4k"
]
},
"width": {
"type": "integer",
"description": "Viewport width in CSS pixels.",
"minimum": 1
},
"description": {
"type": "string",
"description": "What this viewport verifies.",
"minLength": 1
}
},
"required": [
"id",
"width",
"description"
],
"additionalProperties": false
}
}
},
"required": [
"siteId",
"previewUrl",
"publicUrl",
"viewports"
],
"additionalProperties": false
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example/preview",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId}/preview without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*/preview",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.publish.preflight",
"title": "Get site publish preflight",
"description": "Check publish readiness, verification URLs, responsive viewports, and rollback action without changing the site.",
"permission": "studio:read",
"method": "GET",
"path": "/api/studio/sites/{siteId}/publish-preflight",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Non-mutating publish readiness result.",
"properties": {
"canPublish": {
"type": "boolean",
"description": "Whether deterministic launch gates allow publishing."
},
"siteId": {
"type": "string",
"description": "Site identifier.",
"minLength": 1
},
"previewUrl": {
"type": "string",
"description": "Draft preview URL to verify visually.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public URL that publishing will activate.",
"format": "uri"
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"requiredViewports": {
"type": "array",
"description": "Viewport widths that must be visually verified.",
"items": {
"type": "integer",
"description": "Viewport width in CSS pixels.",
"minimum": 1
}
},
"rollbackActionId": {
"type": "string",
"description": "Action used to restore a previous published version.",
"const": "app_topolo_web.sites.versions.restore"
}
},
"required": [
"canPublish",
"siteId",
"previewUrl",
"publicUrl",
"qualityReport",
"requiredViewports",
"rollbackActionId"
],
"additionalProperties": false,
"$defs": {
"jsonValue": {
"description": "A JSON-compatible component property value.",
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/jsonValue"
}
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
}
]
},
"actionLink": {
"type": "object",
"description": "A rendered call-to-action link.",
"properties": {
"label": {
"type": "string",
"description": "Visible link label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, mailto, tel, or HTTPS URL.",
"minLength": 1
},
"linkKind": {
"type": "string",
"description": "Whether the link targets a TopoloWeb page or a custom URL.",
"enum": [
"custom",
"page"
]
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"label",
"href"
],
"additionalProperties": false
},
"navigationItem": {
"type": "object",
"description": "One site navigation entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable navigation item identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Visible navigation label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, or external URL.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Navigation emphasis.",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"description": "Optional parent item identifier for one-level menus."
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
},
"navigationMenu": {
"type": "object",
"description": "A named reusable navigation menu.",
"properties": {
"id": {
"type": "string",
"description": "Stable menu identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable menu name.",
"minLength": 1
},
"placement": {
"type": "string",
"description": "Custom menu placement marker.",
"const": "custom"
},
"items": {
"type": "array",
"description": "Ordered menu entries.",
"items": {
"$ref": "#/$defs/navigationItem"
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
},
"pageStyleDefaultsBase": {
"type": "object",
"description": "Site-wide default layout and typography values.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
}
},
"additionalProperties": false
},
"pageStyleDefaults": {
"type": "object",
"description": "Desktop page defaults with optional viewport overrides.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
},
"responsive": {
"type": "object",
"description": "Viewport-specific page-default overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/pageStyleDefaultsBase"
}
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"description": "Complete TopoloWeb theme and responsive page defaults.",
"properties": {
"primary": {
"type": "string",
"description": "Primary brand color.",
"minLength": 1
},
"secondary": {
"type": "string",
"description": "Secondary brand color.",
"minLength": 1
},
"surface": {
"type": "string",
"description": "Primary surface color.",
"minLength": 1
},
"ink": {
"type": "string",
"description": "Primary text color.",
"minLength": 1
},
"muted": {
"type": "string",
"description": "Muted text color.",
"minLength": 1
},
"accent": {
"type": "string",
"description": "Accent color.",
"minLength": 1
},
"accentSoft": {
"type": "string",
"description": "Soft accent surface color.",
"minLength": 1
},
"glow": {
"type": "string",
"description": "Decorative glow color.",
"minLength": 1
},
"headingFont": {
"type": "string",
"description": "CSS heading font stack.",
"minLength": 1
},
"bodyFont": {
"type": "string",
"description": "CSS body font stack.",
"minLength": 1
},
"radius": {
"type": "string",
"description": "Default CSS corner radius.",
"minLength": 1
},
"brandLogoUrl": {
"type": "string",
"description": "HTTPS brand-logo URL."
},
"brandLogoAlt": {
"type": "string",
"description": "Accessible brand-logo description."
},
"brandLogoWidth": {
"type": "string",
"description": "CSS brand-logo width."
},
"brandLogoHeight": {
"type": "string",
"description": "CSS brand-logo height."
},
"pageDefaults": {
"$ref": "#/$defs/pageStyleDefaults"
},
"customCss": {
"type": "string",
"description": "Reviewed site-wide CSS loaded after generated styles."
}
},
"required": [
"primary",
"secondary",
"surface",
"ink",
"muted",
"accent",
"accentSoft",
"glow",
"headingFont",
"bodyFont",
"radius"
],
"additionalProperties": false
},
"sectionStyleBase": {
"type": "object",
"description": "Desktop section style values.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
}
},
"additionalProperties": false
},
"sectionStyle": {
"type": "object",
"description": "Section style values with optional responsive overrides.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
},
"responsive": {
"type": "object",
"description": "Viewport-specific section-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItemStyleBase": {
"type": "object",
"description": "Desktop repeated-item style values.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
}
},
"additionalProperties": false
},
"sectionItemStyle": {
"type": "object",
"description": "Repeated-item style values with optional responsive overrides.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
},
"responsive": {
"type": "object",
"description": "Viewport-specific item-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionItemStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItem": {
"type": "object",
"description": "One repeated card, row, quote, metric, question, or media item.",
"properties": {
"id": {
"type": "string",
"description": "Stable item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title."
},
"body": {
"type": "string",
"description": "Visible supporting copy."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional value or price."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
},
"styleClassIds": {
"type": "array",
"description": "Reusable item style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"sectionValue": {
"type": "object",
"description": "Renderer-backed block content without persisted child arrays.",
"properties": {
"id": {
"type": "string",
"description": "Stable section identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"eyebrow": {
"type": "string",
"description": "Optional eyebrow copy."
},
"title": {
"type": "string",
"description": "Visible section heading."
},
"body": {
"type": "string",
"description": "Visible section body copy."
},
"kicker": {
"type": "string",
"description": "Optional supporting kicker."
},
"primaryAction": {
"$ref": "#/$defs/actionLink"
},
"secondaryAction": {
"$ref": "#/$defs/actionLink"
},
"imageUrl": {
"type": "string",
"description": "Optional section image URL."
},
"alt": {
"type": "string",
"description": "Accessible section-image description."
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"styleClassIds": {
"type": "array",
"description": "Reusable section style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
},
"style": {
"$ref": "#/$defs/sectionStyle"
},
"formId": {
"type": "string",
"description": "Form identifier for a contact-form block."
},
"collectionSlug": {
"type": "string",
"description": "Collection slug bound to this block."
},
"collectionLimit": {
"type": "number",
"description": "Maximum collection entries rendered.",
"minimum": 1
},
"collectionSort": {
"type": "string",
"description": "Collection sorting behavior.",
"enum": [
"manual",
"title_asc",
"title_desc",
"meta_asc",
"meta_desc"
]
},
"html": {
"type": "string",
"description": "Reviewed HTML for embed-capable blocks."
},
"videoUrl": {
"type": "string",
"description": "Direct, YouTube, or Vimeo video URL."
},
"videoProvider": {
"type": "string",
"description": "Video provider.",
"enum": [
"direct",
"youtube",
"vimeo"
]
},
"videoPosterUrl": {
"type": "string",
"description": "Video poster image URL."
},
"videoAutoplay": {
"type": "boolean",
"description": "Autoplay video when allowed."
},
"videoControls": {
"type": "boolean",
"description": "Show native video controls."
},
"videoMuted": {
"type": "boolean",
"description": "Mute video playback."
},
"componentName": {
"type": "string",
"description": "Approved custom component name."
},
"componentProps": {
"type": "object",
"description": "Component-specific reviewed JSON properties.",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
},
"menuId": {
"type": "string",
"description": "Reusable menu identifier bound to a menu block."
}
},
"required": [
"id",
"kind",
"title",
"body"
],
"additionalProperties": false
},
"pageValue": {
"type": "object",
"description": "Persisted page metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable page identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Root-relative page slug beginning with /.",
"pattern": "^/"
},
"title": {
"type": "string",
"description": "Visible page heading and title-template input.",
"minLength": 1
},
"description": {
"type": "string",
"description": "Page search and social description."
}
},
"required": [
"id",
"slug",
"title",
"description"
],
"additionalProperties": false
},
"columnValue": {
"type": "object",
"description": "Persisted layout-column metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable column identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional editor label."
},
"span": {
"type": "number",
"description": "Grid span.",
"minimum": 1
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Original product-domain identity for a document node.",
"properties": {
"kind": {
"type": "string",
"description": "Source record kind.",
"enum": [
"page",
"section",
"column",
"item"
]
},
"id": {
"type": "string",
"description": "Source record identifier.",
"minLength": 1
}
},
"required": [
"kind",
"id"
],
"additionalProperties": false
},
"pageNode": {
"type": "object",
"description": "A canonical page node owning exactly one page-body slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "page"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Parent node identifier when nested."
},
"source": {
"$ref": "#/$defs/source"
},
"value": {
"$ref": "#/$defs/pageValue"
},
"children": {
"type": "array",
"description": "Exactly one page-body slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"value",
"children"
],
"additionalProperties": false
},
"slotNode": {
"type": "object",
"description": "A canonical child slot controlling accepted node kinds.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "slot"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning page, layout, or block node identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"slotKind": {
"type": "string",
"description": "Child-slot role.",
"enum": [
"page-body",
"layout-column",
"block-items"
]
},
"accepts": {
"type": "array",
"description": "Document node kinds allowed in this slot.",
"items": {
"type": "string",
"description": "One allowed node kind.",
"enum": [
"layout",
"block",
"item"
]
}
},
"parentSectionId": {
"type": "string",
"description": "Owning section identifier for layout and block slots."
},
"columnId": {
"type": "string",
"description": "Column identifier for layout-column slots."
},
"value": {
"$ref": "#/$defs/columnValue"
},
"children": {
"type": "array",
"description": "Canonical child nodes.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"slotKind",
"accepts",
"children"
],
"additionalProperties": false
},
"layoutNode": {
"type": "object",
"description": "A canonical layout block owning one or more layout-column slots.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "layout"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"layoutKind": {
"type": "string",
"description": "Layout behavior.",
"enum": [
"container",
"grid",
"stack",
"flex-row",
"columns"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Layout-column slots.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"layoutKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"blockNode": {
"type": "object",
"description": "A canonical renderer block with optional block-items slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "block"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"blockKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Optional block-items slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"blockKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"itemNode": {
"type": "object",
"description": "A canonical repeated-item leaf node.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "item"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning block-items slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"parentSectionId": {
"type": "string",
"description": "Owning block section identifier.",
"minLength": 1
},
"itemId": {
"type": "string",
"description": "Persisted item identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionItem"
},
"children": {
"type": "array",
"description": "Item nodes are leaves and must have no children.",
"maxItems": 0
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"parentSectionId",
"itemId",
"value",
"children"
],
"additionalProperties": false
},
"siteDocumentNode": {
"description": "One canonical TopoloWeb document node.",
"oneOf": [
{
"$ref": "#/$defs/pageNode"
},
{
"$ref": "#/$defs/slotNode"
},
{
"$ref": "#/$defs/layoutNode"
},
{
"$ref": "#/$defs/blockNode"
},
{
"$ref": "#/$defs/itemNode"
}
]
},
"siteDocument": {
"type": "object",
"description": "Canonical versioned TopoloWeb document tree.",
"properties": {
"version": {
"type": "integer",
"description": "Document schema version.",
"const": 1
},
"pages": {
"type": "array",
"description": "Canonical page nodes.",
"items": {
"$ref": "#/$defs/pageNode"
}
}
},
"required": [
"version",
"pages"
],
"additionalProperties": false
},
"styleClass": {
"description": "A reusable section or item style class.",
"oneOf": [
{
"type": "object",
"description": "Reusable section style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "section"
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Reusable repeated-item style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "item"
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
},
"collectionItem": {
"type": "object",
"description": "One reusable CMS collection entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection-item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title.",
"minLength": 1
},
"body": {
"type": "string",
"description": "Visible item body."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional price or value."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"collection": {
"type": "object",
"description": "Reusable CMS collection.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Stable collection slug.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Collection content kind.",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"description": "Human-readable collection label.",
"minLength": 1
},
"items": {
"type": "array",
"description": "Ordered collection entries.",
"items": {
"$ref": "#/$defs/collectionItem"
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
},
"codeSnippet": {
"type": "object",
"description": "Reviewed bounded code injection.",
"properties": {
"id": {
"type": "string",
"description": "Stable snippet identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable snippet label.",
"minLength": 1
},
"slot": {
"type": "string",
"description": "Injection slot.",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string",
"description": "Reviewed HTML, CSS, or JavaScript source."
},
"enabled": {
"type": "boolean",
"description": "Whether this snippet is active."
}
},
"required": [
"id",
"label",
"slot",
"code",
"enabled"
],
"additionalProperties": false
},
"seo": {
"type": "object",
"description": "Site-wide search and social metadata defaults.",
"properties": {
"titleTemplate": {
"type": "string",
"description": "Title template; %s is replaced by the page title."
},
"metaTitle": {
"type": "string",
"description": "Default page title override."
},
"metaDescription": {
"type": "string",
"description": "Default search and social description."
},
"faviconUrl": {
"type": "string",
"description": "Browser and bookmark icon URL."
},
"openGraphImageUrl": {
"type": "string",
"description": "Default Open Graph image URL."
},
"canonicalUrl": {
"type": "string",
"description": "Canonical site URL."
}
},
"additionalProperties": false
},
"siteContent": {
"type": "object",
"description": "Complete canonical TopoloWeb site content.",
"properties": {
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"siteTitle": {
"type": "string",
"description": "Public site title.",
"minLength": 1
},
"siteDescription": {
"type": "string",
"description": "Public site description."
},
"contactEmail": {
"type": "string",
"description": "Public contact email.",
"minLength": 1
},
"contactPhone": {
"type": "string",
"description": "Optional public contact phone number."
},
"navigation": {
"type": "array",
"description": "Primary site navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"footerNavigation": {
"type": "array",
"description": "Footer navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"menus": {
"type": "array",
"description": "Reusable custom menus.",
"items": {
"$ref": "#/$defs/navigationMenu"
}
},
"styleClasses": {
"type": "array",
"description": "Reusable section and item styles.",
"items": {
"$ref": "#/$defs/styleClass"
}
},
"theme": {
"$ref": "#/$defs/theme"
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"description": "Reusable CMS collections.",
"items": {
"$ref": "#/$defs/collection"
}
},
"codeSnippets": {
"type": "array",
"description": "Reviewed bounded code snippets.",
"items": {
"$ref": "#/$defs/codeSnippet"
}
},
"seo": {
"$ref": "#/$defs/seo"
}
},
"required": [
"intent",
"siteTitle",
"siteDescription",
"contactEmail",
"navigation",
"footerNavigation",
"menus",
"styleClasses",
"theme",
"document",
"collections",
"codeSnippets"
],
"additionalProperties": false
},
"createSite": {
"type": "object",
"description": "Brief used to create a new TopoloWeb site.",
"properties": {
"name": {
"type": "string",
"description": "Internal and initial public site name.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"description": "Business or project category.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Primary intended audience.",
"minLength": 1
},
"offer": {
"type": "string",
"description": "Primary product, service, or proposition.",
"minLength": 1
},
"tone": {
"type": "string",
"description": "Desired writing and visual tone.",
"minLength": 1
},
"location": {
"type": "string",
"description": "Optional geographic market."
},
"differentiators": {
"type": "array",
"description": "Specific differentiators to communicate.",
"items": {
"type": "string",
"description": "One differentiator."
}
},
"goals": {
"type": "array",
"description": "Desired user and business outcomes.",
"items": {
"type": "string",
"description": "One goal."
}
},
"prompt": {
"type": "string",
"description": "Additional generation direction."
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"qualityIssue": {
"type": "object",
"description": "One actionable launch-quality finding.",
"properties": {
"id": {
"type": "string",
"description": "Stable issue code.",
"minLength": 1
},
"severity": {
"type": "string",
"description": "Issue severity.",
"enum": [
"info",
"warning",
"error"
]
},
"title": {
"type": "string",
"description": "Short issue title.",
"minLength": 1
},
"detail": {
"type": "string",
"description": "Actionable remediation detail.",
"minLength": 1
}
},
"required": [
"id",
"severity",
"title",
"detail"
],
"additionalProperties": false
},
"qualityReport": {
"type": "object",
"description": "Deterministic content and launch-quality report.",
"properties": {
"generatedAt": {
"type": "string",
"description": "ISO-8601 generation timestamp.",
"format": "date-time"
},
"score": {
"type": "number",
"description": "Quality score from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"description": "Actionable quality findings.",
"items": {
"$ref": "#/$defs/qualityIssue"
}
}
},
"required": [
"generatedAt",
"score",
"issues"
],
"additionalProperties": false
},
"siteRecord": {
"type": "object",
"description": "One TopoloWeb site and its current editable content.",
"properties": {
"id": {
"type": "string",
"description": "Stable site identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Platform hostname slug.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Internal site name.",
"minLength": 1
},
"status": {
"type": "string",
"description": "Current lifecycle status.",
"enum": [
"draft",
"published",
"archived"
]
},
"brief": {
"type": "object",
"description": "Generation brief retained for iterative edits.",
"additionalProperties": true
},
"draftContent": {
"$ref": "#/$defs/siteContent"
},
"currentVersionId": {
"type": "string",
"description": "Currently published immutable version identifier."
},
"draftPreviewToken": {
"type": "string",
"description": "Opaque token used by the draft preview URL.",
"minLength": 1
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"slug",
"name",
"status",
"brief",
"draftContent",
"draftPreviewToken",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteVersion": {
"type": "object",
"description": "One immutable published site version.",
"properties": {
"id": {
"type": "string",
"description": "Stable version identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"versionNumber": {
"type": "integer",
"description": "Monotonic site version number.",
"minimum": 1
},
"label": {
"type": "string",
"description": "Human-readable version label.",
"minLength": 1
},
"snapshot": {
"$ref": "#/$defs/siteContent"
},
"previewToken": {
"type": "string",
"description": "Opaque immutable-version preview token.",
"minLength": 1
},
"publishedAt": {
"type": "string",
"description": "ISO-8601 publication timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"versionNumber",
"label",
"snapshot",
"previewToken",
"publishedAt"
],
"additionalProperties": false
},
"siteDomain": {
"type": "object",
"description": "One platform or custom site domain.",
"properties": {
"id": {
"type": "string",
"description": "Stable domain identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"hostname": {
"type": "string",
"description": "Domain hostname without scheme.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Domain ownership kind.",
"enum": [
"platform",
"custom"
]
},
"status": {
"type": "string",
"description": "DNS and TLS activation status.",
"enum": [
"pending_dns",
"pending_ssl",
"active",
"failed"
]
},
"dnsTarget": {
"type": "string",
"description": "DNS target required for this domain.",
"minLength": 1
},
"verificationToken": {
"type": "string",
"description": "Opaque DNS ownership verification token.",
"minLength": 1
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the primary public hostname."
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"hostname",
"kind",
"status",
"dnsTarget",
"verificationToken",
"isPrimary",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteUrls": {
"type": "object",
"description": "Stable URLs used to preview and verify the site.",
"properties": {
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public site URL.",
"format": "uri"
}
},
"required": [
"previewUrl",
"publicUrl"
],
"additionalProperties": false
},
"siteDetails": {
"type": "object",
"description": "Complete editable site state returned after a build.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One site form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions"
],
"additionalProperties": false
}
}
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example/publish-preflight",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId}/publish-preflight without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*/publish-preflight",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.collections.list",
"title": "Sites Collections List",
"description": "Call GET /studio/sites/{siteId}/collections.",
"method": "GET",
"path": "/api/studio/sites/{siteId}/collections",
"permission": "studio:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Collections List.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example/collections",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId}/collections without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*/collections",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.code_snippets.list",
"title": "Sites Code Snippets List",
"description": "Call GET /studio/sites/{siteId}/code-snippets.",
"method": "GET",
"path": "/api/studio/sites/{siteId}/code-snippets",
"permission": "settings:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Code Snippets List.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example/code-snippets",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId}/code-snippets without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*/code-snippets",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.agent_sessions.list",
"title": "Sites Agent Sessions List",
"description": "Call GET /studio/sites/{siteId}/agent/sessions.",
"method": "GET",
"path": "/api/studio/sites/{siteId}/agent/sessions",
"permission": "studio:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Agent Sessions List.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example/agent/sessions",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId}/agent/sessions without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*/agent/sessions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.agent_sessions.get",
"title": "Sites Agent Sessions Get",
"description": "Call GET /studio/sites/{siteId}/agent/sessions/{sessionId}.",
"method": "GET",
"path": "/api/studio/sites/{siteId}/agent/sessions/{sessionId}",
"permission": "studio:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
},
"sessionId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId",
"sessionId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Agent Sessions Get.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example",
"sessionId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example/agent/sessions/example",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId}/agent/sessions/{sessionId} without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*/agent/sessions/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.versions.list",
"title": "Sites Versions List",
"description": "Call GET /studio/sites/{siteId}/versions.",
"method": "GET",
"path": "/api/studio/sites/{siteId}/versions",
"permission": "studio:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Versions List.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example/versions",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId}/versions without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*/versions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.versions.restore",
"title": "Restore site version",
"description": "Restore and publish one saved site version.",
"permission": "publish:write",
"method": "POST",
"path": "/api/studio/sites/{siteId}/versions/{versionId}/restore",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Restore TopoloWeb site version",
"type": "object",
"description": "Restore one immutable version belonging to the selected site and activate it as a new version.",
"properties": {
"siteId": {
"type": "string",
"description": "Site identifier returned by site discovery.",
"minLength": 1
},
"versionId": {
"type": "string",
"description": "Version identifier returned by sites.versions.list for the same site.",
"minLength": 1
}
},
"required": [
"siteId",
"versionId"
],
"additionalProperties": false
},
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Published site, immutable version, quality evidence, and verification URLs.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"version": {
"$ref": "#/$defs/siteVersion"
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"urls": {
"$ref": "#/$defs/siteUrls"
}
},
"required": [
"site",
"version",
"qualityReport",
"urls"
],
"additionalProperties": false,
"$defs": {
"jsonValue": {
"description": "A JSON-compatible component property value.",
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/jsonValue"
}
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
}
]
},
"actionLink": {
"type": "object",
"description": "A rendered call-to-action link.",
"properties": {
"label": {
"type": "string",
"description": "Visible link label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, mailto, tel, or HTTPS URL.",
"minLength": 1
},
"linkKind": {
"type": "string",
"description": "Whether the link targets a TopoloWeb page or a custom URL.",
"enum": [
"custom",
"page"
]
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"label",
"href"
],
"additionalProperties": false
},
"navigationItem": {
"type": "object",
"description": "One site navigation entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable navigation item identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Visible navigation label.",
"minLength": 1
},
"href": {
"type": "string",
"description": "Root-relative path, anchor, or external URL.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Navigation emphasis.",
"enum": [
"primary",
"secondary",
"cta"
]
},
"parentId": {
"type": "string",
"description": "Optional parent item identifier for one-level menus."
},
"targetBlank": {
"type": "boolean",
"description": "Open the link in a new browser tab."
}
},
"required": [
"id",
"label",
"href",
"kind"
],
"additionalProperties": false
},
"navigationMenu": {
"type": "object",
"description": "A named reusable navigation menu.",
"properties": {
"id": {
"type": "string",
"description": "Stable menu identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable menu name.",
"minLength": 1
},
"placement": {
"type": "string",
"description": "Custom menu placement marker.",
"const": "custom"
},
"items": {
"type": "array",
"description": "Ordered menu entries.",
"items": {
"$ref": "#/$defs/navigationItem"
}
}
},
"required": [
"id",
"name",
"placement",
"items"
],
"additionalProperties": false
},
"pageStyleDefaultsBase": {
"type": "object",
"description": "Site-wide default layout and typography values.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
}
},
"additionalProperties": false
},
"pageStyleDefaults": {
"type": "object",
"description": "Desktop page defaults with optional viewport overrides.",
"properties": {
"sectionPaddingTop": {
"type": "number",
"description": "Default section top padding in pixels.",
"minimum": 0
},
"sectionPaddingBottom": {
"type": "number",
"description": "Default section bottom padding in pixels.",
"minimum": 0
},
"sectionPaddingLeft": {
"type": "number",
"description": "Default section left padding in pixels.",
"minimum": 0
},
"sectionPaddingRight": {
"type": "number",
"description": "Default section right padding in pixels.",
"minimum": 0
},
"sectionMarginTop": {
"type": "number",
"description": "Default section top margin in pixels."
},
"sectionMarginBottom": {
"type": "number",
"description": "Default section bottom margin in pixels."
},
"sectionMarginLeft": {
"type": "number",
"description": "Default section left margin in pixels."
},
"sectionMarginRight": {
"type": "number",
"description": "Default section right margin in pixels."
},
"headingSize": {
"type": "number",
"description": "Default heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Default heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Default body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Default body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Default card padding in pixels.",
"minimum": 0
},
"layoutGap": {
"type": "number",
"description": "Default layout gap in pixels.",
"minimum": 0
},
"responsive": {
"type": "object",
"description": "Viewport-specific page-default overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/pageStyleDefaultsBase"
}
}
},
"additionalProperties": false
},
"theme": {
"type": "object",
"description": "Complete TopoloWeb theme and responsive page defaults.",
"properties": {
"primary": {
"type": "string",
"description": "Primary brand color.",
"minLength": 1
},
"secondary": {
"type": "string",
"description": "Secondary brand color.",
"minLength": 1
},
"surface": {
"type": "string",
"description": "Primary surface color.",
"minLength": 1
},
"ink": {
"type": "string",
"description": "Primary text color.",
"minLength": 1
},
"muted": {
"type": "string",
"description": "Muted text color.",
"minLength": 1
},
"accent": {
"type": "string",
"description": "Accent color.",
"minLength": 1
},
"accentSoft": {
"type": "string",
"description": "Soft accent surface color.",
"minLength": 1
},
"glow": {
"type": "string",
"description": "Decorative glow color.",
"minLength": 1
},
"headingFont": {
"type": "string",
"description": "CSS heading font stack.",
"minLength": 1
},
"bodyFont": {
"type": "string",
"description": "CSS body font stack.",
"minLength": 1
},
"radius": {
"type": "string",
"description": "Default CSS corner radius.",
"minLength": 1
},
"brandLogoUrl": {
"type": "string",
"description": "HTTPS brand-logo URL."
},
"brandLogoAlt": {
"type": "string",
"description": "Accessible brand-logo description."
},
"brandLogoWidth": {
"type": "string",
"description": "CSS brand-logo width."
},
"brandLogoHeight": {
"type": "string",
"description": "CSS brand-logo height."
},
"pageDefaults": {
"$ref": "#/$defs/pageStyleDefaults"
},
"customCss": {
"type": "string",
"description": "Reviewed site-wide CSS loaded after generated styles."
}
},
"required": [
"primary",
"secondary",
"surface",
"ink",
"muted",
"accent",
"accentSoft",
"glow",
"headingFont",
"bodyFont",
"radius"
],
"additionalProperties": false
},
"sectionStyleBase": {
"type": "object",
"description": "Desktop section style values.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
}
},
"additionalProperties": false
},
"sectionStyle": {
"type": "object",
"description": "Section style values with optional responsive overrides.",
"properties": {
"backgroundColor": {
"type": "string",
"description": "CSS background color."
},
"backgroundImageUrl": {
"type": "string",
"description": "HTTPS background image URL."
},
"backgroundMode": {
"type": "string",
"description": "Background image sizing mode.",
"enum": [
"cover",
"contain",
"stretch",
"tile"
]
},
"backgroundPosition": {
"type": "string",
"description": "Background image position.",
"enum": [
"center",
"top",
"bottom",
"left",
"right",
"top left",
"top right",
"bottom left",
"bottom right"
]
},
"textColor": {
"type": "string",
"description": "CSS foreground color."
},
"textAlign": {
"type": "string",
"description": "Text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"imagePlacement": {
"type": "string",
"description": "Media placement relative to text.",
"enum": [
"left",
"right"
]
},
"itemsPlacement": {
"type": "string",
"description": "Repeated items placement relative to section copy for supported compositions.",
"enum": [
"left",
"right"
]
},
"paddingTop": {
"type": "number",
"description": "Top padding in pixels.",
"minimum": 0
},
"paddingBottom": {
"type": "number",
"description": "Bottom padding in pixels.",
"minimum": 0
},
"paddingBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom padding should stay linked."
},
"paddingLeft": {
"type": "number",
"description": "Left padding in pixels.",
"minimum": 0
},
"paddingRight": {
"type": "number",
"description": "Right padding in pixels.",
"minimum": 0
},
"paddingInlineLinked": {
"type": "boolean",
"description": "Whether left and right padding should stay linked."
},
"marginTop": {
"type": "number",
"description": "Top margin in pixels."
},
"marginBottom": {
"type": "number",
"description": "Bottom margin in pixels."
},
"marginBlockLinked": {
"type": "boolean",
"description": "Whether top and bottom margins should stay linked."
},
"marginLeft": {
"type": "number",
"description": "Left margin in pixels."
},
"marginRight": {
"type": "number",
"description": "Right margin in pixels."
},
"marginInlineLinked": {
"type": "boolean",
"description": "Whether left and right margins should stay linked."
},
"borderWidth": {
"type": "number",
"description": "Border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Border line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "CSS border color."
},
"borderRadius": {
"type": "number",
"description": "Corner radius in pixels.",
"minimum": 0
},
"headingSize": {
"type": "number",
"description": "Heading font size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Body font size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Body line-height multiplier.",
"minimum": 0.5
},
"cardPadding": {
"type": "number",
"description": "Repeated-card padding in pixels.",
"minimum": 0
},
"columnCount": {
"type": "number",
"description": "Responsive column count.",
"enum": [
2,
3,
4
]
},
"columnSpans": {
"type": "array",
"description": "Grid spans for explicit columns.",
"items": {
"type": "number",
"description": "One column span.",
"minimum": 1
}
},
"layoutGap": {
"type": "number",
"description": "Gap between layout children in pixels.",
"minimum": 0
},
"nestedSectionPadding": {
"type": "number",
"description": "Padding around nested sections in pixels.",
"minimum": 0
},
"mediaAspectRatio": {
"type": "string",
"description": "Media aspect ratio.",
"enum": [
"16 / 9",
"4 / 3",
"1 / 1",
"9 / 16"
]
},
"mediaFit": {
"type": "string",
"description": "Media object-fit behavior.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"mediaFocalX": {
"type": "number",
"description": "Horizontal focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"mediaFocalY": {
"type": "number",
"description": "Vertical focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"dividerTop": {
"type": "boolean",
"description": "Whether a top divider is rendered."
},
"dividerBottom": {
"type": "boolean",
"description": "Whether a bottom divider is rendered."
},
"dividerThickness": {
"type": "number",
"description": "Divider thickness in pixels.",
"minimum": 0
},
"dividerWidth": {
"type": "number",
"description": "Divider width percentage.",
"minimum": 0,
"maximum": 100
},
"dividerLineStyle": {
"type": "string",
"description": "Divider line style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"customCss": {
"type": "string",
"description": "Reviewed CSS declarations scoped to this section."
},
"responsive": {
"type": "object",
"description": "Viewport-specific section-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItemStyleBase": {
"type": "object",
"description": "Desktop repeated-item style values.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
}
},
"additionalProperties": false
},
"sectionItemStyle": {
"type": "object",
"description": "Repeated-item style values with optional responsive overrides.",
"properties": {
"padding": {
"type": "number",
"description": "Item padding in pixels.",
"minimum": 0
},
"radius": {
"type": "number",
"description": "Item corner radius in pixels.",
"minimum": 0
},
"borderWidth": {
"type": "number",
"description": "Item border width in pixels.",
"minimum": 0
},
"borderStyle": {
"type": "string",
"description": "Item border style.",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"borderColor": {
"type": "string",
"description": "Item border color."
},
"imageFit": {
"type": "string",
"description": "Item image fit.",
"enum": [
"cover",
"contain",
"fill",
"none"
]
},
"imageFocalX": {
"type": "number",
"description": "Horizontal image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"imageFocalY": {
"type": "number",
"description": "Vertical image focal point from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"textPadding": {
"type": "number",
"description": "Text-panel padding in pixels.",
"minimum": 0
},
"textRadius": {
"type": "number",
"description": "Text-panel corner radius in pixels.",
"minimum": 0
},
"textAlign": {
"type": "string",
"description": "Item text alignment.",
"enum": [
"left",
"center",
"right"
]
},
"headingSize": {
"type": "number",
"description": "Item heading size in pixels.",
"minimum": 1
},
"headingLineHeight": {
"type": "number",
"description": "Item heading line-height multiplier.",
"minimum": 0.5
},
"bodySize": {
"type": "number",
"description": "Item body size in pixels.",
"minimum": 1
},
"bodyLineHeight": {
"type": "number",
"description": "Item body line-height multiplier.",
"minimum": 0.5
},
"responsive": {
"type": "object",
"description": "Viewport-specific item-style overrides.",
"propertyNames": {
"type": "string",
"description": "A non-desktop responsive override breakpoint.",
"enum": [
"4k",
"tablet",
"mobile"
]
},
"additionalProperties": {
"$ref": "#/$defs/sectionItemStyleBase"
}
}
},
"additionalProperties": false
},
"sectionItem": {
"type": "object",
"description": "One repeated card, row, quote, metric, question, or media item.",
"properties": {
"id": {
"type": "string",
"description": "Stable item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title."
},
"body": {
"type": "string",
"description": "Visible supporting copy."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional value or price."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
},
"styleClassIds": {
"type": "array",
"description": "Reusable item style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"sectionValue": {
"type": "object",
"description": "Renderer-backed block content without persisted child arrays.",
"properties": {
"id": {
"type": "string",
"description": "Stable section identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"eyebrow": {
"type": "string",
"description": "Optional eyebrow copy."
},
"title": {
"type": "string",
"description": "Visible section heading."
},
"body": {
"type": "string",
"description": "Visible section body copy."
},
"kicker": {
"type": "string",
"description": "Optional supporting kicker."
},
"primaryAction": {
"$ref": "#/$defs/actionLink"
},
"secondaryAction": {
"$ref": "#/$defs/actionLink"
},
"imageUrl": {
"type": "string",
"description": "Optional section image URL."
},
"alt": {
"type": "string",
"description": "Accessible section-image description."
},
"presentation": {
"type": "string",
"description": "A renderer-backed composition designed for the selected block type.",
"enum": [
"annotated",
"cards",
"columns",
"divided",
"editorial",
"manifesto",
"mosaic",
"poster",
"ruled",
"split",
"spotlight",
"tiers",
"timeline"
]
},
"styleClassIds": {
"type": "array",
"description": "Reusable section style-class identifiers.",
"items": {
"type": "string",
"description": "One style-class identifier.",
"minLength": 1
}
},
"style": {
"$ref": "#/$defs/sectionStyle"
},
"formId": {
"type": "string",
"description": "Form identifier for a contact-form block."
},
"collectionSlug": {
"type": "string",
"description": "Collection slug bound to this block."
},
"collectionLimit": {
"type": "number",
"description": "Maximum collection entries rendered.",
"minimum": 1
},
"collectionSort": {
"type": "string",
"description": "Collection sorting behavior.",
"enum": [
"manual",
"title_asc",
"title_desc",
"meta_asc",
"meta_desc"
]
},
"html": {
"type": "string",
"description": "Reviewed HTML for embed-capable blocks."
},
"videoUrl": {
"type": "string",
"description": "Direct, YouTube, or Vimeo video URL."
},
"videoProvider": {
"type": "string",
"description": "Video provider.",
"enum": [
"direct",
"youtube",
"vimeo"
]
},
"videoPosterUrl": {
"type": "string",
"description": "Video poster image URL."
},
"videoAutoplay": {
"type": "boolean",
"description": "Autoplay video when allowed."
},
"videoControls": {
"type": "boolean",
"description": "Show native video controls."
},
"videoMuted": {
"type": "boolean",
"description": "Mute video playback."
},
"componentName": {
"type": "string",
"description": "Approved custom component name."
},
"componentProps": {
"type": "object",
"description": "Component-specific reviewed JSON properties.",
"additionalProperties": {
"$ref": "#/$defs/jsonValue"
}
},
"menuId": {
"type": "string",
"description": "Reusable menu identifier bound to a menu block."
}
},
"required": [
"id",
"kind",
"title",
"body"
],
"additionalProperties": false
},
"pageValue": {
"type": "object",
"description": "Persisted page metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable page identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Root-relative page slug beginning with /.",
"pattern": "^/"
},
"title": {
"type": "string",
"description": "Visible page heading and title-template input.",
"minLength": 1
},
"description": {
"type": "string",
"description": "Page search and social description."
}
},
"required": [
"id",
"slug",
"title",
"description"
],
"additionalProperties": false
},
"columnValue": {
"type": "object",
"description": "Persisted layout-column metadata.",
"properties": {
"id": {
"type": "string",
"description": "Stable column identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Optional editor label."
},
"span": {
"type": "number",
"description": "Grid span.",
"minimum": 1
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Original product-domain identity for a document node.",
"properties": {
"kind": {
"type": "string",
"description": "Source record kind.",
"enum": [
"page",
"section",
"column",
"item"
]
},
"id": {
"type": "string",
"description": "Source record identifier.",
"minLength": 1
}
},
"required": [
"kind",
"id"
],
"additionalProperties": false
},
"pageNode": {
"type": "object",
"description": "A canonical page node owning exactly one page-body slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "page"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Parent node identifier when nested."
},
"source": {
"$ref": "#/$defs/source"
},
"value": {
"$ref": "#/$defs/pageValue"
},
"children": {
"type": "array",
"description": "Exactly one page-body slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"value",
"children"
],
"additionalProperties": false
},
"slotNode": {
"type": "object",
"description": "A canonical child slot controlling accepted node kinds.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "slot"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning page, layout, or block node identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"slotKind": {
"type": "string",
"description": "Child-slot role.",
"enum": [
"page-body",
"layout-column",
"block-items"
]
},
"accepts": {
"type": "array",
"description": "Document node kinds allowed in this slot.",
"items": {
"type": "string",
"description": "One allowed node kind.",
"enum": [
"layout",
"block",
"item"
]
}
},
"parentSectionId": {
"type": "string",
"description": "Owning section identifier for layout and block slots."
},
"columnId": {
"type": "string",
"description": "Column identifier for layout-column slots."
},
"value": {
"$ref": "#/$defs/columnValue"
},
"children": {
"type": "array",
"description": "Canonical child nodes.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"slotKind",
"accepts",
"children"
],
"additionalProperties": false
},
"layoutNode": {
"type": "object",
"description": "A canonical layout block owning one or more layout-column slots.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "layout"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"layoutKind": {
"type": "string",
"description": "Layout behavior.",
"enum": [
"container",
"grid",
"stack",
"flex-row",
"columns"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Layout-column slots.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"layoutKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"blockNode": {
"type": "object",
"description": "A canonical renderer block with optional block-items slot.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "block"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"blockKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"sectionId": {
"type": "string",
"description": "Persisted section identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionValue"
},
"children": {
"type": "array",
"description": "Optional block-items slot.",
"items": {
"$ref": "#/$defs/siteDocumentNode"
}
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"source",
"blockKind",
"sectionKind",
"sectionId",
"value",
"children"
],
"additionalProperties": false
},
"itemNode": {
"type": "object",
"description": "A canonical repeated-item leaf node.",
"properties": {
"id": {
"type": "string",
"description": "Stable document node identifier.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Document node kind.",
"const": "item"
},
"pageId": {
"type": "string",
"description": "Owning page identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable editor label.",
"minLength": 1
},
"path": {
"type": "array",
"description": "Stable document-tree path segments.",
"items": {
"type": "string",
"description": "One path segment.",
"minLength": 1
}
},
"parentNodeId": {
"type": "string",
"description": "Owning block-items slot identifier.",
"minLength": 1
},
"source": {
"$ref": "#/$defs/source"
},
"parentSectionId": {
"type": "string",
"description": "Owning block section identifier.",
"minLength": 1
},
"itemId": {
"type": "string",
"description": "Persisted item identifier.",
"minLength": 1
},
"value": {
"$ref": "#/$defs/sectionItem"
},
"children": {
"type": "array",
"description": "Item nodes are leaves and must have no children.",
"maxItems": 0
}
},
"required": [
"id",
"kind",
"pageId",
"label",
"path",
"parentNodeId",
"source",
"parentSectionId",
"itemId",
"value",
"children"
],
"additionalProperties": false
},
"siteDocumentNode": {
"description": "One canonical TopoloWeb document node.",
"oneOf": [
{
"$ref": "#/$defs/pageNode"
},
{
"$ref": "#/$defs/slotNode"
},
{
"$ref": "#/$defs/layoutNode"
},
{
"$ref": "#/$defs/blockNode"
},
{
"$ref": "#/$defs/itemNode"
}
]
},
"siteDocument": {
"type": "object",
"description": "Canonical versioned TopoloWeb document tree.",
"properties": {
"version": {
"type": "integer",
"description": "Document schema version.",
"const": 1
},
"pages": {
"type": "array",
"description": "Canonical page nodes.",
"items": {
"$ref": "#/$defs/pageNode"
}
}
},
"required": [
"version",
"pages"
],
"additionalProperties": false
},
"styleClass": {
"description": "A reusable section or item style class.",
"oneOf": [
{
"type": "object",
"description": "Reusable section style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "section"
},
"style": {
"$ref": "#/$defs/sectionStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Reusable repeated-item style class.",
"properties": {
"id": {
"type": "string",
"description": "Stable style-class identifier.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Human-readable class name.",
"minLength": 1
},
"targetKind": {
"type": "string",
"description": "The renderer-backed TopoloWeb block kind.",
"enum": [
"container",
"layout-grid",
"stack",
"flex-row",
"spacer",
"hero",
"feature-grid",
"story",
"proof",
"header",
"announcement",
"menu",
"columns",
"accordion",
"faq",
"cta",
"contact-form",
"image",
"gallery",
"video",
"logo-cloud",
"stats",
"testimonials",
"pricing",
"comparison-table",
"app-grid",
"article-list",
"legal",
"embed",
"custom-component",
"divider",
"footer"
]
},
"targetScope": {
"type": "string",
"description": "Style-class target scope.",
"const": "item"
},
"style": {
"$ref": "#/$defs/sectionItemStyle"
}
},
"required": [
"id",
"name",
"targetKind",
"targetScope",
"style"
],
"additionalProperties": false
}
]
},
"collectionItem": {
"type": "object",
"description": "One reusable CMS collection entry.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection-item identifier.",
"minLength": 1
},
"title": {
"type": "string",
"description": "Visible item title.",
"minLength": 1
},
"body": {
"type": "string",
"description": "Visible item body."
},
"meta": {
"type": "string",
"description": "Optional metadata."
},
"value": {
"type": "string",
"description": "Optional price or value."
},
"badge": {
"type": "string",
"description": "Optional badge label."
},
"href": {
"type": "string",
"description": "Optional item link."
},
"targetBlank": {
"type": "boolean",
"description": "Open the item link in a new tab."
},
"imageUrl": {
"type": "string",
"description": "Optional item image URL."
},
"alt": {
"type": "string",
"description": "Accessible item-image description."
}
},
"required": [
"id",
"title",
"body"
],
"additionalProperties": false
},
"collection": {
"type": "object",
"description": "Reusable CMS collection.",
"properties": {
"id": {
"type": "string",
"description": "Stable collection identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Stable collection slug.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Collection content kind.",
"enum": [
"apps",
"pricing",
"articles",
"changelog",
"legal",
"faq",
"custom"
]
},
"label": {
"type": "string",
"description": "Human-readable collection label.",
"minLength": 1
},
"items": {
"type": "array",
"description": "Ordered collection entries.",
"items": {
"$ref": "#/$defs/collectionItem"
}
}
},
"required": [
"id",
"slug",
"kind",
"label",
"items"
],
"additionalProperties": false
},
"codeSnippet": {
"type": "object",
"description": "Reviewed bounded code injection.",
"properties": {
"id": {
"type": "string",
"description": "Stable snippet identifier.",
"minLength": 1
},
"label": {
"type": "string",
"description": "Human-readable snippet label.",
"minLength": 1
},
"slot": {
"type": "string",
"description": "Injection slot.",
"enum": [
"head",
"body_start",
"body_end"
]
},
"code": {
"type": "string",
"description": "Reviewed HTML, CSS, or JavaScript source."
},
"enabled": {
"type": "boolean",
"description": "Whether this snippet is active."
}
},
"required": [
"id",
"label",
"slot",
"code",
"enabled"
],
"additionalProperties": false
},
"seo": {
"type": "object",
"description": "Site-wide search and social metadata defaults.",
"properties": {
"titleTemplate": {
"type": "string",
"description": "Title template; %s is replaced by the page title."
},
"metaTitle": {
"type": "string",
"description": "Default page title override."
},
"metaDescription": {
"type": "string",
"description": "Default search and social description."
},
"faviconUrl": {
"type": "string",
"description": "Browser and bookmark icon URL."
},
"openGraphImageUrl": {
"type": "string",
"description": "Default Open Graph image URL."
},
"canonicalUrl": {
"type": "string",
"description": "Canonical site URL."
}
},
"additionalProperties": false
},
"siteContent": {
"type": "object",
"description": "Complete canonical TopoloWeb site content.",
"properties": {
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"siteTitle": {
"type": "string",
"description": "Public site title.",
"minLength": 1
},
"siteDescription": {
"type": "string",
"description": "Public site description."
},
"contactEmail": {
"type": "string",
"description": "Public contact email.",
"minLength": 1
},
"contactPhone": {
"type": "string",
"description": "Optional public contact phone number."
},
"navigation": {
"type": "array",
"description": "Primary site navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"footerNavigation": {
"type": "array",
"description": "Footer navigation.",
"items": {
"$ref": "#/$defs/navigationItem"
}
},
"menus": {
"type": "array",
"description": "Reusable custom menus.",
"items": {
"$ref": "#/$defs/navigationMenu"
}
},
"styleClasses": {
"type": "array",
"description": "Reusable section and item styles.",
"items": {
"$ref": "#/$defs/styleClass"
}
},
"theme": {
"$ref": "#/$defs/theme"
},
"document": {
"$ref": "#/$defs/siteDocument"
},
"collections": {
"type": "array",
"description": "Reusable CMS collections.",
"items": {
"$ref": "#/$defs/collection"
}
},
"codeSnippets": {
"type": "array",
"description": "Reviewed bounded code snippets.",
"items": {
"$ref": "#/$defs/codeSnippet"
}
},
"seo": {
"$ref": "#/$defs/seo"
}
},
"required": [
"intent",
"siteTitle",
"siteDescription",
"contactEmail",
"navigation",
"footerNavigation",
"menus",
"styleClasses",
"theme",
"document",
"collections",
"codeSnippets"
],
"additionalProperties": false
},
"createSite": {
"type": "object",
"description": "Brief used to create a new TopoloWeb site.",
"properties": {
"name": {
"type": "string",
"description": "Internal and initial public site name.",
"minLength": 1
},
"intent": {
"type": "string",
"description": "The kind of website being created.",
"enum": [
"business_site",
"landing_page",
"portfolio",
"agency",
"product_suite"
]
},
"businessType": {
"type": "string",
"description": "Business or project category.",
"minLength": 1
},
"audience": {
"type": "string",
"description": "Primary intended audience.",
"minLength": 1
},
"offer": {
"type": "string",
"description": "Primary product, service, or proposition.",
"minLength": 1
},
"tone": {
"type": "string",
"description": "Desired writing and visual tone.",
"minLength": 1
},
"location": {
"type": "string",
"description": "Optional geographic market."
},
"differentiators": {
"type": "array",
"description": "Specific differentiators to communicate.",
"items": {
"type": "string",
"description": "One differentiator."
}
},
"goals": {
"type": "array",
"description": "Desired user and business outcomes.",
"items": {
"type": "string",
"description": "One goal."
}
},
"prompt": {
"type": "string",
"description": "Additional generation direction."
}
},
"required": [
"name",
"businessType",
"audience",
"offer",
"tone"
],
"additionalProperties": false
},
"qualityIssue": {
"type": "object",
"description": "One actionable launch-quality finding.",
"properties": {
"id": {
"type": "string",
"description": "Stable issue code.",
"minLength": 1
},
"severity": {
"type": "string",
"description": "Issue severity.",
"enum": [
"info",
"warning",
"error"
]
},
"title": {
"type": "string",
"description": "Short issue title.",
"minLength": 1
},
"detail": {
"type": "string",
"description": "Actionable remediation detail.",
"minLength": 1
}
},
"required": [
"id",
"severity",
"title",
"detail"
],
"additionalProperties": false
},
"qualityReport": {
"type": "object",
"description": "Deterministic content and launch-quality report.",
"properties": {
"generatedAt": {
"type": "string",
"description": "ISO-8601 generation timestamp.",
"format": "date-time"
},
"score": {
"type": "number",
"description": "Quality score from 0 to 100.",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"description": "Actionable quality findings.",
"items": {
"$ref": "#/$defs/qualityIssue"
}
}
},
"required": [
"generatedAt",
"score",
"issues"
],
"additionalProperties": false
},
"siteRecord": {
"type": "object",
"description": "One TopoloWeb site and its current editable content.",
"properties": {
"id": {
"type": "string",
"description": "Stable site identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"slug": {
"type": "string",
"description": "Platform hostname slug.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Internal site name.",
"minLength": 1
},
"status": {
"type": "string",
"description": "Current lifecycle status.",
"enum": [
"draft",
"published",
"archived"
]
},
"brief": {
"type": "object",
"description": "Generation brief retained for iterative edits.",
"additionalProperties": true
},
"draftContent": {
"$ref": "#/$defs/siteContent"
},
"currentVersionId": {
"type": "string",
"description": "Currently published immutable version identifier."
},
"draftPreviewToken": {
"type": "string",
"description": "Opaque token used by the draft preview URL.",
"minLength": 1
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"slug",
"name",
"status",
"brief",
"draftContent",
"draftPreviewToken",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteVersion": {
"type": "object",
"description": "One immutable published site version.",
"properties": {
"id": {
"type": "string",
"description": "Stable version identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"versionNumber": {
"type": "integer",
"description": "Monotonic site version number.",
"minimum": 1
},
"label": {
"type": "string",
"description": "Human-readable version label.",
"minLength": 1
},
"snapshot": {
"$ref": "#/$defs/siteContent"
},
"previewToken": {
"type": "string",
"description": "Opaque immutable-version preview token.",
"minLength": 1
},
"publishedAt": {
"type": "string",
"description": "ISO-8601 publication timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"versionNumber",
"label",
"snapshot",
"previewToken",
"publishedAt"
],
"additionalProperties": false
},
"siteDomain": {
"type": "object",
"description": "One platform or custom site domain.",
"properties": {
"id": {
"type": "string",
"description": "Stable domain identifier.",
"minLength": 1
},
"organizationId": {
"type": "string",
"description": "Owning Topolo organization identifier.",
"minLength": 1
},
"workspaceId": {
"type": "string",
"description": "Owning Topolo workspace identifier.",
"minLength": 1
},
"siteId": {
"type": "string",
"description": "Parent site identifier.",
"minLength": 1
},
"hostname": {
"type": "string",
"description": "Domain hostname without scheme.",
"minLength": 1
},
"kind": {
"type": "string",
"description": "Domain ownership kind.",
"enum": [
"platform",
"custom"
]
},
"status": {
"type": "string",
"description": "DNS and TLS activation status.",
"enum": [
"pending_dns",
"pending_ssl",
"active",
"failed"
]
},
"dnsTarget": {
"type": "string",
"description": "DNS target required for this domain.",
"minLength": 1
},
"verificationToken": {
"type": "string",
"description": "Opaque DNS ownership verification token.",
"minLength": 1
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the primary public hostname."
},
"createdAt": {
"type": "string",
"description": "ISO-8601 creation timestamp.",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"description": "ISO-8601 last-update timestamp.",
"format": "date-time"
}
},
"required": [
"id",
"organizationId",
"workspaceId",
"siteId",
"hostname",
"kind",
"status",
"dnsTarget",
"verificationToken",
"isPrimary",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"siteUrls": {
"type": "object",
"description": "Stable URLs used to preview and verify the site.",
"properties": {
"previewUrl": {
"type": "string",
"description": "Authenticated draft-preview URL.",
"format": "uri"
},
"publicUrl": {
"type": "string",
"description": "Primary public site URL.",
"format": "uri"
}
},
"required": [
"previewUrl",
"publicUrl"
],
"additionalProperties": false
},
"siteDetails": {
"type": "object",
"description": "Complete editable site state returned after a build.",
"properties": {
"site": {
"$ref": "#/$defs/siteRecord"
},
"versions": {
"type": "array",
"description": "Published immutable versions, newest first.",
"items": {
"$ref": "#/$defs/siteVersion"
}
},
"domains": {
"type": "array",
"description": "Platform and custom domains.",
"items": {
"$ref": "#/$defs/siteDomain"
}
},
"assets": {
"type": "array",
"description": "Uploaded or linked site assets.",
"items": {
"type": "object",
"description": "One site asset record.",
"additionalProperties": true
}
},
"submissions": {
"type": "array",
"description": "Recent form submissions.",
"items": {
"type": "object",
"description": "One site form submission.",
"additionalProperties": true
}
},
"events": {
"type": "array",
"description": "Recent site lifecycle events.",
"items": {
"type": "object",
"description": "One site event.",
"additionalProperties": true
}
},
"insights": {
"type": "object",
"description": "Derived site activity counters.",
"additionalProperties": true
},
"qualityReport": {
"$ref": "#/$defs/qualityReport"
},
"agentSessions": {
"type": "array",
"description": "Agent editing sessions.",
"items": {
"type": "object",
"description": "One agent session summary.",
"additionalProperties": true
}
}
},
"required": [
"site",
"versions",
"domains",
"assets",
"submissions",
"events",
"insights",
"qualityReport",
"agentSessions"
],
"additionalProperties": false
}
}
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/web#publish-and-recover",
"resource": {
"kind": "site",
"idPath": "site.id",
"versionPath": "version.id"
},
"effects": [
"Creates and activates a new immutable version from the selected snapshot."
],
"errors": [
{
"status": 404,
"code": "version_not_found",
"recovery": "Call sites.versions.list and select a version belonging to the same site."
}
],
"verify": [
"Open urls.publicUrl and confirm version.id is the new active version."
],
"nextActionIds": [
"app_topolo_web.sites.versions.list"
],
"examples": [
{
"title": "Restore a version from the same site",
"description": "Resolve versionId through sites.versions.list before planning this action.",
"input": {
"siteId": "site_example",
"versionId": "version_example"
}
}
]
},
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "site_example",
"versionId": "version_example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/studio/sites/site_example/versions/version_example/restore",
"body": {
"siteId": "site_example",
"versionId": "version_example"
}
},
"effects": "Creates and activates a new immutable version from the selected snapshot.",
"verification": [
"Open urls.publicUrl and confirm version.id is the new active version."
],
"recovery": [
"404 version_not_found: Call sites.versions.list and select a version belonging to the same site."
],
"docs_url": "https://docs.topolo.app/applications/web#publish-and-recover",
"resource": {
"kind": "site",
"idPath": "site.id",
"versionPath": "version.id"
},
"next_action_ids": [
"app_topolo_web.sites.versions.list"
],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/studio/sites/*/versions/*/restore",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.domains.list",
"title": "Sites Domains List",
"description": "Call GET /studio/sites/{siteId}/domains.",
"method": "GET",
"path": "/api/studio/sites/{siteId}/domains",
"permission": "settings:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Sites Domains List.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example/domains",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId}/domains without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*/domains",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sites.submissions.list",
"title": "List site submissions",
"description": "List form submissions captured by one site.",
"permission": "studio:read",
"method": "GET",
"path": "/api/studio/sites/{siteId}/submissions",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"siteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"siteId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"siteId": "example"
},
"cli_example": [
"topolo actions --service topolo-web --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/studio/sites/example/submissions",
"body": null
},
"effects": "Reads state through GET /api/studio/sites/{siteId}/submissions without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/studio/sites/*/submissions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
}
],
"action_coverage": {
"status": "ok",
"served_routes": 48,
"matched_actions": 44,
"declared_unserved_actions": [],
"coverage_excluded_actions": [],
"uncatalogued_routes": [],
"ignored_routes": 4,
"configured_exclusions": 2,
"configuration_findings": [],
"notes": [
"missing/compiled target runtime — no source found"
]
},
"runtime_contract_audit": {
"status": "verified",
"actions": 44,
"contracts": 44,
"contract_module": "topolo.action-contracts.mjs",
"validator_sources": [
"apps/api/src/index.ts"
],
"authorization_sources": [
"apps/api/src/index.ts"
],
"findings": []
}
}
],
"mobile_contracts": [
{
"source_path": "apps/TopoloWeb/topolo.mobile-experience.json",
"contract": {
"version": "2026-06-29",
"status": "approved",
"mode": "native_capability",
"appId": "app_topolo_web",
"localizationNamespace": "web",
"permissions": [
"studio:read",
"studio:write"
],
"offlinePolicy": "read_through_cache",
"fallbackPath": "/sites",
"auth": {
"audience": "topoloweb",
"scopes": [
"studio:read",
"studio:write"
]
},
"routes": [
{
"path": "/sites",
"apiPath": "/api/studio/sites",
"title": "Sites",
"titleKey": "web.mobile.routes.sites.title",
"template": "record.list",
"dataSource": "web.sites.list",
"detailRoute": "/sites/:id",
"actions": [
{
"id": "web.sites.create",
"title": "Create site",
"type": "record.create",
"permission": "studio:write",
"method": "POST",
"path": "/api/studio/sites",
"fields": [
{
"key": "name",
"label": "Name",
"type": "text",
"required": true
},
{
"key": "slug",
"label": "Slug",
"type": "text",
"required": true
},
{
"key": "description",
"label": "Description",
"type": "textarea"
}
],
"titleKey": "web.mobile.actions.sites.create.title"
},
{
"id": "web.sites.update",
"title": "Update site",
"type": "record.update",
"permission": "studio:write",
"method": "PUT",
"path": "/api/studio/sites/:id",
"fields": [
{
"key": "name",
"label": "Name",
"type": "text"
},
{
"key": "slug",
"label": "Slug",
"type": "text"
},
{
"key": "description",
"label": "Description",
"type": "textarea"
}
],
"titleKey": "web.mobile.actions.sites.update.title"
},
{
"id": "web.sites.delete",
"title": "Delete site",
"type": "record.delete",
"permission": "studio:write",
"method": "DELETE",
"path": "/api/studio/sites/:id",
"titleKey": "web.mobile.actions.sites.delete.title"
}
]
},
{
"path": "/sites/:id",
"apiPath": "/api/studio/sites/:id",
"title": "Site",
"titleKey": "web.mobile.routes.sites.title",
"template": "record.detail",
"dataSource": "web.sites.detail"
}
]
}
}
],
"package_manifests": [],
"deployment_configs": [
{
"source_path": "apps/TopoloWeb/apps/runtime/wrangler.jsonc",
"name": "topolo-web-runtime",
"main": "@astrojs/cloudflare/entrypoints/server",
"compatibility_date": "2026-04-10",
"observability_enabled": true,
"environments": [
"development",
"production",
"staging"
],
"variable_names": [
"PUBLIC_TOPOLOWEB_API_URL",
"PUBLIC_TOPOLOWEB_TURNSTILE_SITE_KEY"
],
"routes": [],
"cron_triggers": [],
"bindings": [
{
"kind": "kv",
"binding": "SESSION",
"target": null
},
{
"kind": "service",
"binding": "API",
"target": null
}
]
}
],
"source_signals": {
"api_routes": [
{
"method": "ALL",
"path": "/__seed/*",
"source_path": "apps/TopoloWeb/apps/api/src/index.ts"
},
{
"method": "GET",
"path": "/health",
"source_path": "apps/TopoloWeb/apps/api/src/index.ts"
},
{
"method": "GET",
"path": "/api/assets/:assetId",
"source_path": "apps/TopoloWeb/apps/api/src/index.ts"
},
{
"method": "GET",
"path": "/api/widget",
"source_path": "apps/TopoloWeb/apps/api/src/index.ts"
},
{
"method": "ALL",
"path": "/",
"source_path": "apps/TopoloWeb/apps/api/src/index.ts"
}
],
"ui_routes": [],
"test_cases": [],
"database_tables": []
},
"documentation": {
"declared_paths": [
"applications/web",
"internal/apps/topolo-web",
"internal/platform/application-entry-and-admission"
],
"present_paths": [
"applications/web",
"internal/apps/topolo-web",
"internal/platform/application-entry-and-admission"
],
"missing_paths": [],
"human_reference": "/systems/topolo-web",
"machine_reference": "/machine/systems/topolo-web.json",
"action_examples": 44,
"action_schemas": 44
},
"source_findings": []
}