---
title: "Create External Page"
method: POST
path: "/workspaces/{workspace_id}/pages/external"
tags: ["Page"]
---

# Create External Page

`POST /workspaces/{workspace_id}/pages/external`

> **Closed Alpha** — not yet enabled for all workspaces. Request access at https://developers.myclickfunnels.com/page/code-support.

Create an externally-hosted (SDK) page in a funnel. Unlike internal pages, the visual content lives on your own domain and is registered with ClickFunnels via a lightweight SDK integration.

**Required fields:**
- `external_url`: The fully-qualified URL where your page is hosted.
- `funnel.funnel_id` OR `funnel.show_page_step_id`: Every external page must be created inside a funnel. Standalone external pages are not supported.

**Funnel positioning:**
- `funnel.funnel_id` + optional `sort_order`: Creates a new show page step in the funnel at the specified zero-based position (`0` = first, omit = append at end).
- `funnel.show_page_step_id`: Swaps the existing step to point at the new external page. The previous page on that step becomes an orphan. `sort_order` is ignored in this case.

**Rejected fields** (returns 422 if present): `markup`, `theme_id`, `current_path`, `seo_title`, `seo_description`, `seo_index`, `head_code`, `footer_code`, `live_data_changes`, `show_page_step.product_ids`.

**SDK onboarding:** The response includes an `sdk` block with a `token` (prefixed `cfp_`). To register the page:
1. Add `<meta name="cf-page-token" content="<token>">` to your page's `<head>`.
2. Include the ClickFunnels SDK script tag on the page.

## Path parameters

- `workspace_id` integer, required

## Request body

- object
  - `page` object, required
    - `name` string — Page name. Defaults to the URL host if omitted.
    - `description` string, nullable — A short description of the page (max 1000 characters).
    - `external_url` string, required — The fully-qualified URL of the externally-hosted page (e.g. `https://acme.example.com/my-page`). Must be unique within the workspace.
    - `sort_order` integer — Optional zero-based position within the funnel when using `funnel.funnel_id`. `0` inserts before the first step; omit to append. Ignored when `funnel.show_page_step_id` is used.
    - `funnel` object — Required. Funnel association — provide either `funnel_id` or `show_page_step_id`.
      - `funnel_id` string — The public ID of the funnel to attach this page to.
      - `after_show_page_step_id` union — With `funnel_id`: insert the new step right after this show page step (pass the `show_page_step_id` from GET /funnels/:id/structure; also places the page inside a split branch). Alternative to `sort_order`.
        - integer
        - string
      - `show_page_step_id` union — The ID of an existing show page step to swap this page onto.
        - integer
        - string

## Response `201`

Created

- 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 — a referenced funnel or step id could not be resolved.
- `401` — Unauthorized
- `403` — Forbidden — external (SDK) 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)
