Page

Create Custom HTML Page

Changed on

Create a ClickFunnels-hosted custom HTML page: you supply the complete HTML document and ClickFunnels serves it verbatim at a path on the funnel's domain — no page editor, no PML. Ideal for AI-generated pages: generate the HTML, POST it here, and the page is live as a funnel step.

Required fields:

  • name: The page name.
  • custom_html: The complete HTML document (max 2MB). Served byte-for-byte — include your own CSS/JS inline.

Making the page work with ClickFunnels (opt-ins, tracking): the response includes an sdk block with a token (prefixed cfp_). The HTML should contain:

  1. <meta name="cf-page-token" content="<token>"> inside <head>.
  2. The ClickFunnels SDK script tag (<script src="https://sdk.<root-domain>/sdk.js" defer></script>).
  3. Form fields marked with data-cf-element attributes (email, first-name, last-name, name, phone, custom-attribute:<key>) inside a plain <form>.

Since the token is minted by this call, either create the page first and then PATCH the HTML with the token inserted, or create with placeholder HTML and swap it. The Create an External Page Skill documents the exact form markup convention (it applies to custom HTML pages too — the only difference is ClickFunnels hosts the file).

Standalone vs in a funnel: the funnel block is optional and behaves exactly like POST /pages/external:

  • Omit it to create a standalone page.
  • funnel.funnel_id + optional sort_order or funnel.after_show_page_step_id: create as a step in the funnel.
  • funnel.show_page_step_id: swap an existing step onto this page.

Path: pass current_path (e.g. /my-landing) to choose the URL path on the funnel's domain; omitted, the path derives from the name. Change it later via PATCH /pages/{id} with current_path.

Limitation: viewing a custom HTML page does not advance the visitor's funnel run (form submissions do), so run-based view attribution treats un-submitted custom HTML steps as unvisited.

Rejected fields (returns 422 if present): markup, theme_id, seo_title, seo_description, seo_index, block_ai_crawler, block_ai_search, block_ai_assistant, head_code, footer_code, custom_css, live_data_changes, external_url, show_page_step.product_ids, show_page_step.bumps. To list the page in the domain's sitemap.xml or opt it out of AI crawlers, set seo_index or the block_ai_* flags afterwards via PATCH /pages/{id}.

post/workspaces/{workspace_id}/pages/custom_html

Request

Path parameters

workspace_idstring required

Request body

Response

Created

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