Page

Update an existing internal, custom HTML, or external (SDK) page.

This existing write saves supported page content live; there is currently no separate public page publish or status operation. Read the page back with GET /api/v2/pages/:id to confirm the resource, then check its computed url separately when public delivery matters. A successful write requests cache invalidation but does not prove propagation or reachability. The path accepts a numeric id or public id, and the JSON body uses the page root. PATCH is also supported.

For internal pages, markup replaces live content; it does not promote a saved editor draft or promise deletion of an existing draft blob. For custom HTML pages, custom_html replaces the ClickFunnels-hosted HTML body. For external SDK pages, deploy content on your own host; external_url only changes its registration.

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.

show_page_step.product_ids / show_page_step.bumps (optional, both page types): Append products to the page's checkout step as main products or as order bumps. Both are additive; bumps also promotes a product already attached to the step into a bump, which is how an existing attachment becomes one. Each bumps entry is {product_id, preheadline}, where preheadline is the optional copy shown above that bump's offer. Requires the page to be part of a funnel (400 otherwise).

markup (internal pages only): Replaces live page content. PML covers only a subset of what the ClickFunnels page editor can build, so if this page could have been created or edited in the editor, stop and get explicit approval from the user first: see the approval guardrail. Never resubmit a lossy PML read merely to publish an editor page.

To move externally-hosted pages to a new domain, see Patch one page at a time in the Migrate an External Page Domain Skill.

put/pages/{id}

Request

Path parameters

idstring required

Query parameters

expand[]string[]

Expand additional data in the response. Use expand[]=field_name to include optional fields (e.g., expand[]=head_code&expand[]=footer_code&expand[]=custom_css&expand[]=markup). Markup is opt-in on every endpoint (show, list, create, update) because PML serialization runs per page. custom_css is available on internal pages only. See the Expanding guide for available fields and examples. Read a page's existing markup with expand[]=markup before editing it: see Reading Current Markup in the Pages Skill.

Request body

Example request

{
  "page": {
    "page": {
      "name": "Example Page",
      "description": "Updated page description",
      "seo_title": "Updated SEO Title",
      "seo_description": "Updated meta description",
      "seo_index": true,
      "block_ai_crawler": true,
      "block_ai_search": true,
      "block_ai_assistant": false,
      "head_code": "<script>console.log('updated');</script>",
      "head_code_mode": "append",
      "markup": "<section>\n  <row cols=\"1\">\n    <column>\n      <headline>Welcome to our page</headline>\n      <subheadline>Start your journey here</subheadline>\n    </column>\n  </row>\n</section>\n",
      "show_page_step": {
        "product_ids": [
          "PrdXyz"
        ],
        "bumps": [
          {
            "product_id": "PrdBmp",
            "preheadline": "One-time offer"
          }
        ]
      }
    }
  }
}

Response

OK

idinteger

Page ID

public_idstring

The public identifier of the page

workspace_idinteger

Workspace ID that the page belongs to.

namestring

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>.

descriptionstring nullable

A short description of the page (max 1000 characters).

theme_idinteger nullable

Theme

created_atstring date-time

Created at

seo_titlestring nullable

Custom title for search engine results. Falls back to the site's SEO title if not set.

seo_descriptionstring nullable

Custom meta description for search engine results. Falls back to the site's SEO description if not set.

seo_indexboolean

Whether search engines should index this page. Defaults to false.

block_ai_crawlerboolean

Whether AI training crawlers (GPTBot, ClaudeBot, Google-Extended, Applebot-Extended, CCBot and others) are blocked from using this page's content to train models. Defaults to false. Enforced by a Disallow rule in the domain's robots.txt — see Crawler access (AI opt-out) in the Pages Skill for coverage limits. Independent of seo_index and of the other two AI flags.

block_ai_searchboolean

Whether AI answer engines (OAI-SearchBot, Claude-SearchBot, PerplexityBot and others) are blocked from indexing this page and citing it when people ask questions. Defaults to false. Enforced via robots.txt. See Crawler access (AI opt-out) in the Pages Skill for coverage limits.

block_ai_assistantboolean

Whether AI assistants (ChatGPT-User, Claude-User, Perplexity-User and others) are blocked from opening this page when a person asks them to — for example pasting the page's link into a chat. Defaults to false. Enforced via robots.txt. See Crawler access (AI opt-out) in the Pages Skill for coverage limits.

updated_atstring 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.

custom_html_pageboolean

Whether this is a ClickFunnels-hosted custom HTML page — a page whose entire body is author-supplied HTML served verbatim (no page editor, no PML). Read the HTML via GET /pages/{id}/custom_html and replace it by sending the write-only custom_html string on PATCH /pages/{id}. Create these via POST /workspaces/{workspace_id}/pages/custom_html. (Deliberately named differently from the custom_html request field so echoing a GET payload back into PATCH never collides.)

current_pathstring 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. See Setting a page's path (current_path) in the Pages Skill.

urlstring 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.

head_codestring 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_codestring 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_cssstring 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.

markupstring

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. This serialization is lossy: elements PML has no equivalent for are omitted with no error and no placeholder, so a round-tripped read is not a safe basis for rewriting a page (see the approval guardrail). An empty string therefore does not prove the page is empty: a page built entirely from elements PML cannot express also reads back empty. The value <!-- markup unavailable: page tree could not be serialized --> means the read failed; treat the page as unreadable and do not write that string back. See the Page Markup Skill for the full DSL reference.

Example response

{
  "id": 9,
  "public_id": "kJzvQi",
  "workspace_id": 42000,
  "name": "Great Page",
  "description": "A high-converting sales page",
  "theme_id": null,
  "seo_title": "Great Page - My Brand",
  "seo_description": "Learn more about our amazing offer",
  "seo_index": true,
  "block_ai_crawler": false,
  "block_ai_search": false,
  "block_ai_assistant": false,
  "created_at": "2025-01-01T00:00:00.000Z",
  "updated_at": "2025-01-01T00:00:00.000Z",
  "type": "funnel_page",
  "custom_html_page": false,
  "current_path": "/my-page-canonical",
  "url": "https://myteam.myclickfunnels.com/my-funnel-page",
  "show_page_step": {
    "id": 42,
    "public_id": "aBcDeF",
    "name": "Best Page Step",
    "current_path": "/my-funnel-page",
    "sort_order": 0,
    "products": []
  },
  "funnel": {
    "id": 123,
    "public_id": "xYzAbC",
    "name": "My Sales Funnel"
  },
  "sdk": null,
  "markup": "<section>\n  <row cols=\"1\">\n    <column>\n      <headline>Great Page</headline>\n      <subheadline>Start your journey here</subheadline>\n    </column>\n  </row>\n</section>\n"
}

Changes

    • info

      added the new optional request property /

    • info

      added the new optional request property /

    • info

      added the new optional request property /

    • info

      added the new optional request property /

    • info

      added the new optional request property /

    • info

      added the new optional request property //

    • info

      removed the non-success response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property /// to the response with the status

    • info

      added the optional property /// to the response with the status