# Cactal > Cactal is the agent-native website platform. Build with the built-in Cactal agent in the dashboard, or create, edit, publish, and operate production websites through the REST API and MCP. - [Introduction](https://cactal.ai/docs/index.md): Cactal is the agent-native website platform. Build with the built-in Cactal agent, or create, edit, publish, and operate production websites through the dashboard, the REST API, or MCP. - [Build with the Cactal agent](https://cactal.ai/docs/agents/cactal-agent.md): Cactal's built-in agent lives beside every site's live preview: describe a change in plain language, watch it happen, and approve publishing or sensitive actions. No setup, keys, or connections required. - [Dictate a message](https://cactal.ai/docs/guides/voice-input.md): Dictate and send a message, or review the transcript first. - [Quickstart](https://cactal.ai/docs/quickstart.md): Create a website, add a page, preview it, and publish it live with the Cactal API in about five minutes. - [Create an API key](https://cactal.ai/docs/create-an-api-key.md): Create a Cactal API key, choose its access scope, and store it safely. API keys authenticate every REST and MCP request. - [How Cactal works](https://cactal.ai/docs/concepts/how-cactal-works.md): The Cactal mental model: organizations own websites, every website has a draft head version and a published version, and every operation is available through the dashboard (including the built-in Cactal agent), the REST API, and MCP. - [Websites](https://cactal.ai/docs/concepts/websites.md): The website resource: its fields, the create-edit-publish-serve lifecycle, renaming, soft delete and restore, and transferring a website to another organization. - [Source code](https://cactal.ai/docs/concepts/source-code.md): The website source model: pages, components, reusable modules, singleton files, edit leases, and append-only version history. - [Publishing](https://cactal.ai/docs/concepts/publishing.md): How a draft becomes the live site: the head check, sandboxed publish build, deployment statuses, unpublishing, restore, and rollback. - [CMS](https://cactal.ai/docs/concepts/cms.md): The website CMS: collections, fields, and items, all 14 field types with their exact limits, draft, scheduled, and published items, references with hydration depth, and how published sites read content. - [Assets](https://cactal.ai/docs/concepts/assets.md): Website assets: image and file kinds with exact size and MIME limits, descriptions and categories that make assets searchable, the three-step upload flow, CDN delivery with responsive image variants, and using assets in CMS content and source code. - [Project context](https://cactal.ai/docs/concepts/project-context.md): Give the Cactal agent durable, website-specific knowledge and reference material. - [Domains](https://cactal.ai/docs/concepts/domains.md): How websites get hostnames: the automatic platform subdomain, the draft preview host, and custom domains — DNS records, verification, statuses, the primary domain redirect, and SSL. - [Access control](https://cactal.ai/docs/concepts/access-control.md): Cactal's permission model: organization roles, website-scoped editor roles, capabilities as the underlying vocabulary, how API keys carry the same roles, 404 cross-tenant semantics, and the audit log. - [Edit source code](https://cactal.ai/docs/guides/edit-source-code.md): Learn how to edit website source code over the Cactal API: acquire a lease, write pages, components, and modules, then validate before publishing. - [Build pages with CMS data](https://cactal.ai/docs/guides/build-pages-with-cms-data.md): Use the generated @website SDK to define pages, bind route and query parameters into typed CMS queries, and render item or list results. - [Configure routes and redirects](https://cactal.ai/docs/guides/configure-routes-and-redirects.md): Define static and parameterized page routes, understand matching and canonical URLs, and configure validated local or external redirects in website_config. - [Configure response headers](https://cactal.ai/docs/guides/configure-response-headers.md): Add allowlisted security response headers to every published and preview response through website_config. - [Style a website](https://cactal.ai/docs/guides/style-a-website.md): Use global CSS and Tailwind CSS, define theme tokens and animations, and understand class discovery and stylesheet build constraints. - [Configure SEO metadata](https://cactal.ai/docs/guides/configure-seo-metadata.md): Configure site and page metadata, build SEO titles and descriptions from CMS content, add social previews and JSON-LD, and control canonicals and crawler behavior. - [Customize site-wide files](https://cactal.ai/docs/guides/customize-site-wide-files.md): Create a custom 404 page, place trusted HTML at exact document positions, and understand which site-wide settings require publishing. - [Manage CMS content](https://cactal.ai/docs/guides/manage-cms-content.md): Learn how to model CMS content and manage items over the Cactal API: create, schedule, and publish items, query with filters, search, sort, and depth, then reorder, rename, delete, and restore. - [Upload assets](https://cactal.ai/docs/guides/upload-assets.md): Learn how to upload images and files to a Cactal website: begin an upload with a description and category, PUT the bytes to a presigned URL, finalize the asset, then find it again and use it in CMS fields and source code. - [Generate website images](https://cactal.ai/docs/guides/generate-images.md): Generate up to eight website images in parallel over REST or MCP, guide them with existing assets, and use the CDN-hosted results immediately. - [Connect a custom domain](https://cactal.ai/docs/guides/connect-a-custom-domain.md): Learn how to connect a custom domain to a Cactal website: create the domain, add the returned TXT and CNAME or A records at your DNS provider, verify until active, set the primary domain, and confirm the redirect. - [Preview drafts and versions](https://cactal.ai/docs/guides/preview-drafts-and-versions.md): Learn how to preview a Cactal website's draft head on its draft-- host, share previews with clients, review older versions, and understand how preview hosts relate to publishing. - [Roll back and recover](https://cactal.ai/docs/guides/roll-back-and-recover.md): Learn how to recover a Cactal website: discard the draft head, restore an older source version to head, roll the published website back immediately, and recover from failed builds. - [Read analytics](https://cactal.ai/docs/guides/read-analytics.md): Learn how to read Cactal website analytics over the API: engagement totals, dimension breakdowns, pageview and event time series, and realtime activity, with exact query parameters. - [Invite teammates and clients](https://cactal.ai/docs/guides/invite-teammates-and-clients.md): Learn how to grant access in Cactal: invite teammates with organization roles, invite clients to a single website with editor roles, manage direct editor grants, and remove access. - [Manage API keys](https://cactal.ai/docs/guides/manage-api-keys.md): Learn how to scope, create, rotate, and revoke Cactal API keys: organization-wide versus website-scoped access, expiry, the one-time plaintext rule, per-website key audits, and a rotation runbook. - [Transfer a website](https://cactal.ai/docs/guides/transfer-a-website.md): Learn how to transfer a Cactal website to another organization: access requirements in both organizations, the billing capacity rule for websites with custom domains enabled, what moves with the transfer, and who can see it afterward. - [Bring your own agent](https://cactal.ai/docs/agents/overview.md): Cactal is agent-native: agent-safe platform operations are available over MCP and the complete public API is available over REST. Agents can create websites, edit source, manage content, publish, and operate domains and analytics while scoped access, drafts, and the audit log keep you in control. - [Connect over MCP](https://cactal.ai/docs/agents/mcp.md): Connect any MCP client to Cactal's remote MCP server at https://api.cactal.ai/v1/mcp with OAuth or an API key, agent-safe platform tools, setup examples, and a first-session walkthrough. - [Submit product feedback](https://cactal.ai/docs/agents/product-feedback.md): How agents submit product feedback when a user explicitly asks them to report an issue or suggestion to Cactal. - [Agent-safe publishing](https://cactal.ai/docs/agents/agent-safe-publishing.md): The operational safety model for agent-run website work: website-scoped API keys, draft-first editing, checks before publish, human approval on preview URLs, audit log review, unpublishing, and rollback. - [AI-readable docs](https://cactal.ai/docs/agents/ai-readable-docs.md): Machine surfaces of this documentation: llms.txt and llms-full.txt indexes, a Markdown variant of every page via a .md suffix, a docs-search MCP server at cactal.ai/docs/mcp, contextual menu actions, and the downloadable OpenAPI spec. - [Plans and limits](https://cactal.ai/docs/platform/plans-and-limits.md): Cactal's Free, Pro ($25/mo), and Enterprise plans: included sites, extra-site pricing, the AI credits that power the built-in Cactal agent, feature availability, and product limits for CMS, assets, pagination, and rate limits. Full API and MCP access on every plan. - [Security](https://cactal.ai/docs/platform/security.md): Cactal's security model as implemented: SHA-256-hashed API keys shown once, capability-based access control, cross-tenant 404 isolation, per-organization audit logging with actor attribution, noindex draft previews, separated control and content planes, and sandboxed publish builds. - [Introduction](https://cactal.ai/docs/api-reference/introduction.md): The Cactal API base URL, hosts, versioning, response codes, and conventions. Everything the dashboard does, your code can do. - [Authentication](https://cactal.ai/docs/api-reference/authentication.md): Authenticate Cactal REST requests with API keys and MCP requests with OAuth or API keys. - [Errors](https://cactal.ai/docs/api-reference/errors.md): Every Cactal API error uses one JSON shape: a stable kind, a human-readable message, and optional details. Statuses, causes, and how to recover. - [Pagination](https://cactal.ai/docs/api-reference/pagination.md): Cactal list endpoints use cursor pagination: pass cursor and limit, read items and nextCursor. Defaults, maxima, and iteration patterns. - [Rate limits](https://cactal.ai/docs/api-reference/rate-limits.md): Cactal API rate limits: token buckets per API key, capacities and refill rates, the Retry-After header, and 429 handling. - [Search the Cactal documentation](https://cactal.ai/docs/api-reference/documentation/search-the-cactal-documentation.md): Search the Cactal product documentation: concepts, guides, agent workflows, platform limits, and the API reference. Returns matching Markdown excerpts with page paths; read a full page with the docs read operation. Consult the docs before non-trivial or unfamiliar work such as source-code editing, p… - [Read a Cactal documentation page](https://cactal.ai/docs/api-reference/documentation/read-a-cactal-documentation-page.md): Read one Cactal documentation page as Markdown. Pass a page path from docs search results, for example "concepts/publishing" or "agents/agent-safe-publishing". Pass "llms.txt" for an index of every page with titles and descriptions. - [Submit product feedback](https://cactal.ai/docs/api-reference/feedback/submit-product-feedback.md): Adds user-requested free-form feedback to the Cactal product-feedback inbox. Describe what happened and what would have made the experience better. Agents must set `authorKind` to `agent` even when acting through a user OAuth connection. Never include credentials, secrets, raw sensitive user content… - [Create a website](https://cactal.ai/docs/api-reference/websites/create-a-website.md): Creates a website in the organization. Provide either a `name` (trimmed, 1–200 characters) or a creation `prompt`; a prompt returns immediately with the temporary name `Untitled site`, which the built-in naming request attempts to replace on its next run together with a matching available slug and p… - [List websites](https://cactal.ai/docs/api-reference/websites/list-websites.md): Lists accessible websites. By default returns active websites: use `organizationId` to scope one organization, `scope=shared` without it for direct grants outside your memberships, or `scope=all` with it to combine both; supports `sort` by `createdAt`, `updatedAt`, or `name` and case-insensitive `se… - [Get a website](https://cactal.ai/docs/api-reference/websites/get-a-website.md): Returns a single website by `websiteId`, or by its `organizationSlug` + `websiteSlug` pair when starting from a URL — provide exactly one of the two identifications. The response includes whether the caller can manage the website’s CMS schema and domains. Websites in the trash remain retrievable by… - [Set or clear the website favicon](https://cactal.ai/docs/api-reference/websites/set-or-clear-the-website-favicon.md): Sets the website’s current favicon to a ready PNG, SVG, or ICO image from the same website asset library. Send `assetId: null` to clear it. The change applies immediately to every site host and is independent of source drafts and publishing. Read the current favicon from the `faviconUrl` field on `G… - [Rename a website](https://cactal.ai/docs/api-reference/websites/rename-a-website.md): Updates the website’s display name and, when supplied, its URL slug. The slug must be lowercase, URL-safe, unreserved, and unique among active websites in the organization. - [Delete a website](https://cactal.ai/docs/api-reference/websites/delete-a-website.md): Soft-deletes only the website: it moves to the trash for 30 days and disappears from the default list. Its custom domains are disconnected, which frees the website’s plan slot and releases each hostname for use on another website; restoring the website does not restore them. CMS content, assets, sou… - [Restore a deleted website](https://cactal.ai/docs/api-reference/websites/restore-a-deleted-website.md): Restores a soft-deleted website before its 30-day restore window expires: the deletion and purge-eligibility markers are cleared and the website returns to the active list. Calling this on an active website returns a 404. An expired restore window or an active website claiming the same slug returns… - [Transfer a website to another organization](https://cactal.ai/docs/api-reference/websites/transfer-a-website-to-another-organization.md): Moves the website to a different organization. The target must not be the current owner, and you need transfer permission on the website plus website-creation permission in the target organization. When the website has a custom domain, the target organization must have active billing with a free pla… - [List website editors](https://cactal.ai/docs/api-reference/website-editors/list-website-editors.md): Returns the website’s direct user-account editor grants, newest first as a paginated set. API keys, organization members who inherit access, and email invitations are separate resources. List invitations with `websites.editorInvitations.list`, add editors with `websites.editors.add`, and revoke a gr… - [List website editor invitations](https://cactal.ai/docs/api-reference/website-editors/list-website-editor-invitations.md): Lists website editor invitations newest first with cursor pagination (default 20 per page, maximum 100). The default `status=pending` returns open invitations; use `accepted`, `canceled`, or `all` to inspect invitation history. Cancel a pending invitation with `websites.editors.remove` and its `invi… - [Add a website editor by email](https://cactal.ai/docs/api-reference/website-editors/add-a-website-editor-by-email.md): Gives an email address `full` or `content` editor access to this single website. When the email already belongs to an account, the grant is created immediately (`granted`) — or nothing changes if that account already inherits access through its organization role (`already_inherited`). Otherwise a `p… - [Set a website editor’s role](https://cactal.ai/docs/api-reference/website-editors/set-a-website-editor’s-role.md): Sets the principal’s editor role on this single website, replacing any existing grant for that principal. `role` is `full` (full website editing) or `content` (content editing only). Principals who already inherit access through their organization role are rejected with a validation error. Use `webs… - [Remove a website editor or cancel an invitation](https://cactal.ai/docs/api-reference/website-editors/remove-a-website-editor-or-cancel-an-invitation.md): Revokes a website-scoped editor grant when called with `principalId`, or cancels a pending invitation (so its emailed link stops working) when called with `invitationId` — provide exactly one. Returns 404 when the principal has no direct grant or the invitation does not exist; canceling an invitatio… - [Create an API key](https://cactal.ai/docs/api-reference/api-keys/create-an-api-key.md): Creates an API key that authenticates as its own principal within the organization. `access` grants either one organization-wide role (`admin`, `full_editor`, or `content_editor`) or one role (`full_editor` or `content_editor`) on at least one website in the organization; the `owner` role can never… - [List API keys](https://cactal.ai/docs/api-reference/api-keys/list-api-keys.md): Returns API keys newest first with keyset pagination and their full access configuration. Pass exactly one of `organizationId` (the full organization inventory) or `websiteId` (only keys whose access kind is `websites` with a direct grant on that website — organization-wide keys can also act on the… - [Update an API key](https://cactal.ai/docs/api-reference/api-keys/update-an-api-key.md): Updates `name`, `expiresAt`, and/or `access`; omitted fields are left unchanged, and sending none returns the current metadata. Providing `access` replaces the entire access configuration atomically — previous grants are removed and the change applies to the next request that uses the key; any websi… - [Rotate an API key secret](https://cactal.ai/docs/api-reference/api-keys/rotate-an-api-key-secret.md): Generates a new 32-byte base64url secret for the key and invalidates the old secret immediately; name, expiry, and access are unchanged. The response contains the new plaintext secret exactly once. Revoked or expired keys cannot be rotated (409). - [Revoke an API key](https://cactal.ai/docs/api-reference/api-keys/revoke-an-api-key.md): Permanently deactivates the key by setting `revokedAt`; requests that use it fail with 401 immediately. Revocation is irreversible — rotate instead if the key should keep working with a new secret. Revoking an already-revoked key is a no-op that returns the current metadata. - [Get source version summary](https://cactal.ai/docs/api-reference/source-code/get-source-version-summary.md): Returns `headVersion`, `publishedVersion`, and whether the website has unpublished source changes. - [List source files](https://cactal.ai/docs/api-reference/source-code/list-source-files.md): Lists file identities, sizes, and line counts without contents, sorted by type then name with cursor pagination (default 20, maximum 100). Filter by name with `nameGlob`. Defaults to head; pass `target=published` or an explicit `version`, and pin continuation requests to the resolved response versio… - [Read source files](https://cactal.ai/docs/api-reference/source-code/read-source-files.md): Reads up to 50 files by name from head, published, or an explicit version. A single-file read supports line and character ranges; continue truncated reads with `nextStartCharacter` and the resolved `version`. - [Search source files](https://cactal.ai/docs/api-reference/source-code/search-source-files.md): Finds text across every source file and returns one entry per matching line with its file name, line, and column. Call this first to locate code, then read only the files it names with websiteSourceCode.files.read. `pattern` is literal text unless `isRegex` is set, and matching is line by line, so a… - [List changed source files](https://cactal.ai/docs/api-reference/source-code/list-changed-source-files.md): Lists added, removed, and modified file identities between two version refs, defaulting from published to head. Results use cursor pagination; pin continuation requests to the resolved version numbers. - [Diff one source file](https://cactal.ai/docs/api-reference/source-code/diff-one-source-file.md): Returns a bounded unified diff for one file name between two version refs, defaulting from published to head. - [Acquire the edit lease](https://cactal.ai/docs/api-reference/source-code/acquire-the-edit-lease.md): Acquires and replaces the website's single edit lease. Source mutations and publishing require the returned principal-bound `leaseToken`. - [Create or update a source file](https://cactal.ai/docs/api-reference/source-code/create-or-update-a-source-file.md): Creates or replaces one head file. Pages, components, and modules require `name`; singleton types take only `type`. Requires the active lease and returns `changed: false` for identical content. - [Edit source files with string replacement](https://cactal.ai/docs/api-reference/source-code/edit-source-files-with-string-replacement.md): Atomically applies ordered exact-string edits to up to 50 files and 200 edits in total as one head version. Each `oldStr` must match once unless `replaceAll` is true, and any failing edit aborts the whole call. Set `dryRun` to validate and count replacements without committing. Requires the active l… - [Delete a source file](https://cactal.ai/docs/api-reference/source-code/delete-a-source-file.md): Deletes one head file while preserving history. Address named files by `type` and `name`, and singletons by `type`; requires the active lease. - [Edit a page route](https://cactal.ai/docs/api-reference/source-code/edit-a-page-route.md): Rewrites and normalizes a page's `definePage` route literal. Requires the active lease. - [Edit page or site metadata](https://cactal.ai/docs/api-reference/source-code/edit-page-or-site-metadata.md): Replaces a page's complete metadata object when `page` is sent, otherwise the site defaults in `website_config`. Requires the active lease. - [Validate the head source](https://cactal.ai/docs/api-reference/publishing/validate-the-head-source.md): Runs the publish-time framework quality gate without changing source: format, typecheck, lint, build, and a server-render of every page using placeholder content synthesized from the CMS schema. Failures return `ok: false` with diagnostics, and pages that compiled but threw while rendering in `rende… - [Publish the head version](https://cactal.ai/docs/api-reference/publishing/publish-the-head-version.md): Validates, builds, and publishes head. Canonical formatting may create a new head first. Requires the active lease. - [Restore head to a previous state](https://cactal.ai/docs/api-reference/publishing/restore-head-to-a-previous-state.md): Copies an earlier version or `published` into a new head without publishing or rewriting history. Requires the active lease. - [Roll back to a previous version](https://cactal.ai/docs/api-reference/publishing/roll-back-to-a-previous-version.md): Validates and republishes an earlier version as a new head and published version, preserving history. Requires the active lease. - [Ensure a deployment build](https://cactal.ai/docs/api-reference/publishing/ensure-a-deployment-build.md): Returns an existing non-failed deployment for the selected version or builds one. Poll status when another request is already building it. - [Get deployment build status](https://cactal.ai/docs/api-reference/publishing/get-deployment-build-status.md): Returns the preview revision, available page routes, publish availability, and build state for the selected head or published source version. Fails with 404 when `target=published` is requested for a never-published website. - [Get the CMS schema snapshot](https://cactal.ai/docs/api-reference/cms-collections/get-the-cms-schema-snapshot.md): Returns every active collection and field of a website in one call — the full content model. Collections are ordered newest first; fields are grouped by collection in display order. Use this to discover the schema before reading or writing items. - [Create a collection](https://cactal.ai/docs/api-reference/cms-collections/create-a-collection.md): Creates a collection in the website’s CMS. `slug` uses lowercase letters, digits, and hyphens (max 64 characters, starting with a letter) and must be unique among the website’s active collections; `displayName` is 1–200 characters and `description` up to 2,000. Optionally pass `fields` (up to 100, s… - [List collections](https://cactal.ai/docs/api-reference/cms-collections/list-collections.md): Returns the website’s active collections, newest first, with keyset pagination. `limit` defaults to 20 (max 100); pass the returned `nextCursor` as `cursor` to fetch the next page. - [Get a collection](https://cactal.ai/docs/api-reference/cms-collections/get-a-collection.md): Returns a collection together with its full field list, which defines the shape of every item in it. - [Update a collection](https://cactal.ai/docs/api-reference/cms-collections/update-a-collection.md): Updates `displayName` (1–200 characters), `description` (up to 2,000 characters; pass `null` to clear), and/or `slug` (a rename). A slug change fails with a conflict when another active collection in the website already uses it, and when the website has a published version the rename is validated ag… - [Delete a collection](https://cactal.ai/docs/api-reference/cms-collections/delete-a-collection.md): Soft-deletes the collection, making it and all of its items unreachable through the API; the slug becomes reusable. Refused with a conflict while any reference field in another collection targets this collection — delete those fields first. If the website has a published version, the deletion is val… - [Add a field to a collection](https://cactal.ai/docs/api-reference/cms-fields/add-a-field-to-a-collection.md): Adds a typed field at the end of the collection’s field order. `key` is lowercase snake_case (max 64 characters), must be unique in the collection, and cannot use the reserved metadata names `id`, `slug`, `publishedAt`, `publishAt`, `createdAt`, `updatedAt`, or `position`; `type` is immutable after… - [Update a field](https://cactal.ai/docs/api-reference/cms-fields/update-a-field.md): Updates `displayName`, `description`, `required`, `isUnique`, `example`, and (for `option` fields only) `config`; `type` and `targetCollectionId` are immutable. Setting `required: true` is rejected until every active item has a valid value for the field. Setting `isUnique: true` enforces uniqueness… - [Delete a field](https://cactal.ai/docs/api-reference/cms-fields/delete-a-field.md): Permanently deletes the field and its stored values: the key is stripped from every item’s `data`, and reference or asset attachments made through the field are removed. This cannot be undone. If the website has a published version, the deletion is validated against the published site’s content quer… - [Create an item](https://cactal.ai/docs/api-reference/cms-items/create-an-item.md): Creates an item at the end of the collection’s manual order. Scalar values go in `data` keyed by field key and are validated against the field types — unknown keys are rejected, required fields must be present, `plain_text` and `markdown` are capped at 1,048,576 bytes (markdown must not contain raw… - [List items in a collection](https://cactal.ai/docs/api-reference/cms-items/list-items-in-a-collection.md): Returns the collection’s active items in manual (drag) order by default, 20 per page (max 100); paginate with `cursor` or with 1-based `page` offsets, not both. Filter with `published` (`true` / `false`) and a JSON-encoded `filter` map of `{ fieldKey: { operator: value } }` — operators `eq`, `neq`,… - [Get an item](https://cactal.ai/docs/api-reference/cms-items/get-an-item.md): Returns one item, looked up by `itemId` or by the `collectionId` + `slug` pair (provide exactly one of the two). The `data` object is complete and schema-shaped: every currently-defined field is present and missing optional values read as `null`. `depth` (0–3, default 0) embeds referenced items in p… - [List item backreferences](https://cactal.ai/docs/api-reference/cms-items/list-item-backreferences.md): Lists active items that reference the target item through a `reference` or `multi_reference` field, newest first, with cursor pagination (default 20 per page, maximum 100). Each source item appears once even when multiple fields point to the target. `depth` (0–3, default 0) controls reference hydrat… - [Update an item](https://cactal.ai/docs/api-reference/cms-items/update-an-item.md): Patches an item; omitted fields are left untouched. Keys in `data` are merged into the existing values and validated the same way as on create, while each key provided in `references`, `images`, or `files` replaces that field’s value wholesale — pass `null` (or `[]` for multi-valued fields) to clear… - [Publish, schedule, or unpublish an item](https://cactal.ai/docs/api-reference/cms-items/publish-schedule-or-unpublish-an-item.md): Use exactly one publication action: `published: true` publishes immediately and sets `publishedAt` to now; a future `publishAt` schedules a draft for automatic publication; `published: false` unpublishes an item or cancels its schedule. A published item must be unpublished before it can be scheduled… - [Delete an item](https://cactal.ai/docs/api-reference/cms-items/delete-an-item.md): Soft-deletes the item: it disappears from reads, list results, and backreferences, and fields referencing it read `null` (single reference) or shrink (multi-reference). Its slug becomes reusable, and incoming references are preserved so the item can be restored. - [Restore a deleted item](https://cactal.ai/docs/api-reference/cms-items/restore-a-deleted-item.md): Restores a soft-deleted item, making it readable again and re-exposing references to and from it. Returns 404 when the item is not currently deleted. - [Add a custom domain](https://cactal.ai/docs/api-reference/domains/add-a-custom-domain.md): Claims `hostname` for this website and registers it with the Cactal edge. Custom domains must first be enabled for the website (`websiteDomains.setEnabled`, owner-only — enabling is the billing moment); the request fails with 403 `custom_domains_disabled` otherwise. Adding or removing domains on an… - [List domains for a website](https://cactal.ai/docs/api-reference/domains/list-domains-for-a-website.md): Returns every domain record attached to the website, oldest first: the automatically allocated platform subdomain plus any custom domains. Platform subdomains are always `active`; custom domains carry their current verification status and the DNS records still expected. - [Verify a custom domain](https://cactal.ai/docs/api-reference/domains/verify-a-custom-domain.md): Re-checks the ownership TXT record, edge readiness, and whether an HTTPS request to the hostname reaches this Cactal domain, then returns the updated status. A customer CDN or reverse proxy in front is supported when it forwards the verification request to Cactal. `failureMessage` distinguishes a mi… - [Set the primary custom domain](https://cactal.ai/docs/api-reference/domains/set-the-primary-custom-domain.md): Makes this domain the canonical hostname for the published website: requests reaching the platform subdomain or any other custom domain are permanently redirected (HTTP 308) to it, preserving path and query. Only `active` custom domains can be made primary — the request fails with 409 otherwise. Any… - [Remove a custom domain](https://cactal.ai/docs/api-reference/domains/remove-a-custom-domain.md): Deregisters the hostname from the Cactal edge and deletes the domain record. If the removed domain was primary, the oldest remaining active custom domain is promoted automatically. If edge deregistration fails, the domain stays in `removing` status and a background sweep retries until it is gone. Pl… - [Rename the platform subdomain](https://cactal.ai/docs/api-reference/domains/rename-the-platform-subdomain.md): Moves the website to `