---
title: "Update Page"
method: PUT
path: "/pages/{id}"
tags: ["Page"]
---

# Update Page

`PUT /pages/{id}`

Update an existing page. Works for both internal and external (SDK) pages.

> **Closed Alpha note:** updating an **external** page requires external (SDK) page access — not yet enabled for all workspaces (403 otherwise). Request access at https://developers.myclickfunnels.com/page/code-support. Internal page updates are unaffected.

Field availability depends on the page type — see `PageParametersUpdate` for the full breakdown. Sending an internal-only field on an external page (or `external_url` on an internal page) returns 422 with an explicit list of the rejected field names — never silently ignored.

**`sort_order`** (optional, top-level): Reposition the page within its funnel. Zero-based. Ignored when `funnel.show_page_step_id` is also provided.

**`funnel.show_page_step_id`** (optional): Swap the page onto an existing show page step. The previous page on that step becomes an orphan. Shared by both page types.

**`external_url`** (external pages only): Update the external URL. The SDK token is preserved.

## Path parameters

- `id` string, required

## Query parameters

- `expand[]` string[]

## Request body

- object
  - `page` PageParametersUpdate — Update parameters for a page. Field availability depends on the page type: **Shared (both internal and external pages):** `name`, `description`, `sort_order`, `funnel.show_page_step_id`, `show_page_step.product_ids`. **Internal-only** (returns 422 if sent on an external page): `markup`, `theme_id`, `current_path`, `seo_title`, `seo_description`, `seo_index`, `head_code`, `footer_code`, `custom_css`, `live_data_changes`. **External-only** (returns 422 if sent on an internal page): `external_url`.
    - `name` string — Page name of the editable page element.
    - `description` string, nullable — A short description of the page (max 1000 characters).
    - `sort_order` integer — Reposition the page within its funnel. Zero-based. `0` moves it to the first position. The page must belong to exactly one funnel step; pages with zero or multiple funnel steps return 422. Out-of-bounds values return 422. Ignored when `funnel.show_page_step_id` is also provided — the swap target's position takes precedence.
    - `funnel` object — Optional funnel mutation block. On update, only `show_page_step_id` is supported — swap the page onto an existing show page step.
      - `show_page_step_id` union — The ID of an existing show page step to attach this page to. The page previously linked to that step becomes an orphan (kept in the workspace, no longer linked to any step). Shared by both internal and external pages.
        - integer
        - string
    - `seo_title` string, nullable — Custom title for search engine results. Internal pages only — returns 422 on external pages.
    - `seo_description` string, nullable — Custom meta description for search engine results. Internal pages only — returns 422 on external pages.
    - `seo_index` boolean — Whether search engines should index this page. Internal pages only — returns 422 on external pages.
    - `head_code` string, nullable — Custom code to inject into the page's <head> section. Internal pages only — returns 422 on external pages. Set to null to clear existing code.
    - `head_code_mode` 'append' | 'replace' — How to handle head_code. 'append' adds to existing code (default), 'replace' overwrites. Internal pages only.
    - `footer_code` string, nullable — Custom code to inject before the closing </body> tag. Internal pages only — returns 422 on external pages. Set to null to clear existing code.
    - `footer_code_mode` 'append' | 'replace' — How to handle footer_code. 'append' adds to existing code (default), 'replace' overwrites. Internal pages only.
    - `custom_css` string, nullable — Raw CSS to apply at the page level (no <style> wrapper). Maps to the CSS tab in the page editor's Code Editor panel. Internal pages only — returns 422 on external pages. Set to null to clear existing CSS.
    - `custom_css_mode` 'append' | 'replace' — How to handle custom_css. 'append' adds to existing CSS (default), 'replace' overwrites. Internal pages only.
    - `markup` string — A valid PML (Page Markup Language) string that replaces the page's visual tree. Internal pages only — returns 422 on external pages. See the [Page Markup Skill](https://accounts.myclickfunnels.com/.well-known/page-markup/skill.md) for the full DSL reference.
    - `external_url` string — Update the external URL for an SDK page. External pages only — returns 422 on internal pages. The SDK token is preserved across URL updates.
    - `show_page_step` object — Optional. Mutates the show_page_step that this page is attached to. Only valid when the page is part of a funnel — passing `show_page_step.product_ids` for a page that isn't linked to a funnel returns 400. Shared by both internal and external pages.
      - `product_ids` string[] — List of product public IDs to append to the step's checkout. This is **additive** — products listed are appended; products already attached are skipped; no products are ever removed via this field. All-or-nothing — if any ID does not resolve to a workspace product, no changes are saved and a 400 is returned. To remove products, use `DELETE /api/v2/pages/:id/products`.

## Response `200`

OK

- PageAttributes — Pages
  - `id` integer — Page ID
  - `public_id` string — The public identifier of the page
  - `workspace_id` integer — Workspace ID that the page belongs to.
  - `name` string — Page name of the editable page element. Want to filter by it? See our <i><u><a href="https://developers.myclickfunnels.com/docs/filtering-by-page" target="_blank">help guide on that topic</a><u><i>.
  - `description` string, nullable — A short description of the page (max 1000 characters).
  - `theme_id` integer, nullable — Theme
  - `created_at` string, date-time — Created at
  - `seo_title` string, nullable — Custom title for search engine results. Falls back to the site's SEO title if not set.
  - `seo_description` string, nullable — Custom meta description for search engine results. Falls back to the site's SEO description if not set.
  - `seo_index` boolean — Whether search engines should index this page. Defaults to false.
  - `updated_at` string, date-time — Updated at
  - `type` 'landing_page' | 'site_page' | 'funnel_page' | 'theme_page' | 'null', nullable — The type of page. Can be one of `landing_page`, `site_page`, `funnel_page` or `theme_page`. May be `null` for a page that matches none of these categories.
  - `current_path` string, nullable — The current URL path for the page resource. This is the canonical URL for landing and site pages. `null` for externally-hosted (SDK) pages. **For funnel pages this is NOT the customer-facing URL** — that's `url` (or `show_page_step.current_path` for the path component). The page-level current_path on a funnel page does not route the visitor through the workflow step, so a `<checkout/>` element on it will not see the step's attached products.
  - `url` string, nullable — The customer-facing URL for the page on the live site. For funnel pages this routes through the workflow step (which feeds `<checkout/>` its IncludedProducts). Always prefer this over `current_path` when constructing links.
  - `show_page_step` object, nullable — The show page step (the workflow step's _function_) associated with this page. The `products` array is the live list of products attached to this step's checkout; it is mutated via `show_page_step.product_ids` on page create/update (additive) and `DELETE /api/v2/pages/:id/products` (removal).
    - `id` integer — The ID of the show page step (function). Pass this as `show_page_step_id` when positioning split-test or conditional-split steps via `/api/v2/funnels/:id/split_test_steps` and `/api/v2/funnels/:id/conditional_split_steps`.
    - `public_id` string — The public identifier of the show page step (function). May be passed as `show_page_step_id` alongside other `public_id` references in your code.
    - `name` string — The name of the step in the funnel. This is the page name that is visible in the funnel builder for a show page step.
    - `current_path` string, nullable — The current URL path for the step in the funnel. This is the path component of the live, customer-facing URL for funnel pages. `null` for externally-hosted (SDK) pages.
    - `sort_order` integer — The zero-based position of this step within the funnel. The first step is 0, the second is 1, and so on. Returned in every page response; pass `sort_order` on create/update to control positioning.
    - `products` object[] — Products currently attached to this step's checkout. Mutated via `show_page_step.product_ids` on page create/update (additive) and `DELETE /api/v2/pages/:id/products` (removal).
      - `id` integer — Product ID
      - `public_id` string — Product public ID
      - `name` string — Product name
  - `funnel` object, nullable — The funnel associated with this page (if the page is part of a funnel)
    - `id` integer — The unique identifier of the funnel
    - `public_id` string — The public identifier of the funnel
    - `name` string — The name of the funnel
  - `sdk` object, nullable — Present for externally-hosted (SDK) pages; `null` for internal pages. Contains the SDK integration token and the external URL where the page is hosted.
    - `token` string — The SDK page token (prefixed `cfp_`). Embed this in the external page via a `<meta name="cf-page-token" content="<token>">` tag and include the SDK script tag to register the page with ClickFunnels.
    - `external_url` string — The fully-qualified URL of the externally-hosted page.
  - `head_code` string, nullable — **Expandable** Custom HTML/JavaScript code injected into the page head section. Only returned when expand[]=head_code is provided. Note: expanding may add latency, especially on list endpoints. Use sparingly.
  - `footer_code` string, nullable — **Expandable** Custom HTML/JavaScript code injected before the closing body tag. Only returned when expand[]=footer_code is provided. Note: expanding may add latency, especially on list endpoints. Use sparingly.
  - `custom_css` string, nullable — **Expandable** Raw CSS applied at the page level (no <style> wrapper). Maps to the CSS tab in the page editor's Code Editor panel. Internal pages only. Only returned when expand[]=custom_css is provided. Note: expanding may add latency, especially on list endpoints. Use sparingly.
  - `markup` string — **Expandable** The PML (Page Markup Language) representation of the page's visual tree. Only returned when expand[]=markup is provided. Note: expanding may add latency, especially on list endpoints. Empty string when the page has no visual content yet. See the [Page Markup Skill](https://accounts.myclickfunnels.com/.well-known/page-markup/skill.md) for the full DSL reference.

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden — the target page is external (SDK) and external page access is not enabled for this workspace.
- `404` — Not Found
- `422` — Unprocessable Entity

---

[API](https://skmtc.net/myclickfunnels/apis/clickfunnels-api.md) · [All operations](https://skmtc.net/myclickfunnels/apis/clickfunnels-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/myclickfunnels/clickfunnels-api/versions/ae6313eaa176/schema)
