Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: ClickFunnels Page API
termsOfService: https://www.clickfunnels.com/terms-of-service
contact:
name: ClickFunnels API Team
url: https://developers.myclickfunnels.com
x-logo:
url: https://statics.myclickfunnels.com/image/1126065/file/31edf05760fafe41a82f16a668ab251f.png
description: 'The ClickFunnels REST API that powers webhooks, native integrations, and Zapier lets you manage your ClickFunnels data, automate your workflows, and recreate ClickFunnels functionality in your own apps.
'
license:
name: MIT
url: https://opensource.org/licenses/MIT
version: 2.0.0
servers:
- url: https://{subdomain}.myclickfunnels.com/api/v2
description: ClickFunnels API
variables:
subdomain:
default: myworkspace
security:
- BearerAuth: []
tags:
- name: Page
description: '> Page offers extra information about ClickFunnels pages, like those that are part of funnels.
It''s the main element that the user modifies when editing a Page in the ClickFunnels editor.
You can also learn how to source Page name and public ID from your ClickFunnels UI
[here](https://developers.myclickfunnels.com/docs/filtering-by-page).
See the [Pages Skill](https://accounts.myclickfunnels.com/.well-known/pages/skill.md) for [building a page](https://accounts.myclickfunnels.com/.well-known/pages/skill.md#building-a-page) and [positioning it within a funnel](https://accounts.myclickfunnels.com/.well-known/pages/skill.md#positioning-a-page-within-a-funnel); the page body is authored in PML — see the [Page Markup Skill](https://accounts.myclickfunnels.com/.well-known/page-markup/skill.md). For pages you host yourself, see [Create an External Page](https://accounts.myclickfunnels.com/.well-known/sdk/create-external-page/skill.md) and [Add Checkout to an External Page](https://accounts.myclickfunnels.com/.well-known/sdk/add-checkout/skill.md). To move those externally-hosted pages to a new domain, see [Migrate an External Page Domain](https://accounts.myclickfunnels.com/.well-known/sdk/migrate-external-page-domain/skill.md).
'
paths:
/workspaces/{workspace_id}/pages:
get:
tags:
- Page
summary: List Pages
description: Page offers extra information about ClickFunnels pages, like those that are part of funnels.
operationId: listPages
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
- $ref: '#/components/parameters/after'
- $ref: '#/components/parameters/sort_order'
- $ref: '#/components/parameters/sort_property'
- name: filter
in: query
description: 'Filter by available properties in query params, like this: `api/v2/resources?filter[id]=value&filter[another_property]=value1,value2`. Check our Filtering guide for examples and all about filtering [here](https://developers.myclickfunnels.com/docs/filtering).
'
required: false
schema:
type: object
properties:
id:
type: string
description: A comma-separated list of page IDs to filter by.
example: 1,42
theme_id:
type: string
description: A comma-separated list of theme IDs to filter by.
example: 1,42
funnel_pages:
type: boolean
description: Only show pages that belong to a funnel as opposed to standalone landing or site pages.
example: true
funnel_ids:
type: string
description: A comma-separated list of funnel IDs to filter pages by. Returns only pages belonging to the specified funnels.
example: 123,456
style: deepObject
explode: true
- $ref: '#/components/parameters/ExpandPageFields'
responses:
'200':
description: OK
headers:
Pagination-Next:
$ref: '#/components/headers/PaginationNext'
Link:
$ref: '#/components/headers/Link'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/PageAttributes'
example:
- id: 61
public_id: eldUyN
workspace_id: 42000
name: Great Page
theme_id: null
created_at: '2025-01-01T00:00:00.000Z'
updated_at: '2025-01-01T00:00:00.000Z'
type: funnel_page
current_path: /great-page
url: https://myteam.myclickfunnels.com/funnel-great-page
show_page_step:
id: 100
public_id: xYz123
name: Great Page Step
current_path: /funnel-great-page
sort_order: 0
products: []
funnel:
id: 50
public_id: AbC789
name: Sales Funnel
sdk: null
description: null
seo_description: null
seo_index: false
seo_title: null
- id: 62
public_id: AtcUVH
workspace_id: 42000
name: Landing Page
theme_id: null
created_at: '2025-01-01T00:00:00.000Z'
updated_at: '2025-01-01T00:00:00.000Z'
type: landing_page
current_path: /landing-page
url: https://myteam.myclickfunnels.com/landing-page
show_page_step: null
funnel: null
sdk: null
description: null
seo_description: null
seo_index: false
seo_title: null
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: API key missing or invalid
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
error:
type: string
description: Not found - This usually happens when you try to access a record that does not exist in your account. It can also happen when the provided parent record is missing, e.g. you have put in a non-existent Workspaces parent ID.
example:
error: 'Not found: Record missing'
post:
tags:
- Page
summary: Create Page
description: 'Create a new internal page in the workspace. By default, creating a page without references to a funnel or show page step will create a standalone landing page.
You can optionally attach the page to a funnel by providing either:
- `funnel.funnel_id`: Creates a new show page step in the specified funnel. When provided without `show_page_step_id`, the page is added as the last step of the funnel, positioned after the currently last page.
- `funnel.show_page_step_id`: Swaps the referenced step to point at this newly created page. The page previously linked to that step becomes an orphan (kept in the workspace, no longer linked to any step).
**`sort_order`** (optional, top-level): Controls the zero-based position within the funnel when creating with `funnel.funnel_id`. `0` inserts before the first existing step; omit to append at the end. Out-of-bounds values (negative or greater than the current step count) return 422. `sort_order` is ignored when `funnel.show_page_step_id` is used — the swap target''s current position is preserved.
**`funnel.after_show_page_step_id`** (optional, with `funnel.funnel_id`): Insert the new step right after the referenced show page step — also places the page inside a split branch. Alternative to `sort_order`. An id that does not resolve to a step in the funnel returns 400.
To also attach products to the page''s checkout step in the same call, pass `show_page_step.product_ids: [...]` (sibling of `funnel`). This is the only way to set products at create time — the legacy `funnel.products` shape is rejected with a 400. Products attachment is **additive** and **all-or-nothing**: any unresolved id fails the whole request and the page is not created.
**Order bumps**: pass `show_page_step.bumps: [{product_id, preheadline}]` (same semantics as `product_ids`) to attach products as order bumps instead of main products, each with its own optional `preheadline` — the line of copy shown above that bump''s offer. A product may appear in only one of the two blocks per request; naming it in both returns a 400.
**`external_url` is rejected** — to create an externally-hosted (SDK) page use `POST /api/v2/workspaces/:workspace_id/pages/external`.
'
operationId: createPage
externalDocs:
description: Pages Skill - building a page (PML body)
url: https://accounts.myclickfunnels.com/.well-known/pages/skill.md#building-a-page
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
- $ref: '#/components/parameters/ExpandPageFields'
requestBody:
description: Information about the Page to create
required: true
content:
application/json:
schema:
type: object
properties:
page:
type: object
$ref: '#/components/schemas/PageParameters'
example:
page:
name: My New Page
current_path: /my-new-page
theme_id: 12345
description: A landing page for our new product launch
seo_title: New Product Launch - My Brand
seo_description: Discover our latest product offering
seo_index: true
funnel:
funnel_id: xyz789
show_page_step:
product_ids:
- PrdAbc
head_code: <script>console.log('hello');</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"
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/PageAttributes'
example:
id: 70
public_id: NewPgX
workspace_id: 42000
name: My New Page
theme_id: 12345
created_at: '2025-01-01T00:00:00.000Z'
updated_at: '2025-01-01T00:00:00.000Z'
type: funnel_page
current_path: /my-new-page-xyz123
url: https://myteam.myclickfunnels.com/my-new-page
show_page_step:
id: 200
public_id: StpNew
name: My New Page
current_path: /my-new-page
sort_order: 0
products: []
funnel:
id: 100
public_id: xyz789
name: Target Funnel
sdk: null
description: null
seo_description: null
seo_index: false
seo_title: null
'400':
description: Bad Request
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
invalid_funnel_id:
summary: Invalid funnel_id
value:
error: 'Bad request: The funnel with the provided ID cannot be found.'
invalid_show_page_step_id:
summary: Invalid show_page_step_id
value:
error: 'Bad request: The step with the provided ID cannot be found.'
invalid_code_mode:
summary: Invalid code mode
value:
error: 'Bad request: Invalid code mode ''invalid''. Must be ''append'' or ''replace''.'
invalid_markup:
summary: Invalid PML markup
value:
error: 'Bad request: Markup is not valid PML: unknown top-level element(s) <foo>. Top-level elements must be one of: <section>, <row>, <column>, <flex>, <headline>, <subheadline>, <paragraph>, <image>, <input>, <button>, <list>, <video>, <divider>, <link>, <countdown>, <accordion>, <customhtml>, <product-carousel>, <order-summary>, <checkout>, <confirmation>, <product-name>, <product-description>, <product-price>, <product-image>, <product-link>, <saved-section>. (line 3)'
product_in_both_lists:
summary: a product is named as both a main product and an order bump
value:
error: 'Bad request: Product(s) cannot be listed in both product_ids and bumps: PrdBmp'
bumps_entry_without_product_id:
summary: a show_page_step.bumps entry is missing its product_id
value:
error: 'Bad request: Every show_page_step.bumps entry requires a product_id.'
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: API key missing or invalid
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: 'Not found: Record missing'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
name_blank:
summary: Name is blank
value:
error: 'Request unprocessable: Name can''t be blank'
external_url_rejected:
summary: external_url is not allowed on this endpoint
value:
error: 'Request unprocessable: The following fields are not valid on this endpoint: external_url. Use POST /api/v2/workspaces/:workspace_id/pages/external to create externally-hosted (SDK) pages.'
out_of_bounds_sort_order:
summary: sort_order out of bounds
value:
error: 'Request unprocessable: sort_order 5 is out of bounds (funnel has 3 step(s)).'
/workspaces/{workspace_id}/pages/external:
post:
tags:
- Page
summary: Create External Page
description: '> **Closed Alpha** — not yet enabled for all workspaces. Request access at https://developers.myclickfunnels.com/page/code-support.
Create an externally-hosted (SDK) page. 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.
**Standalone vs in a funnel:** the `funnel` block is optional.
- Omit it to create a **standalone** external page: registered with an SDK token and visit tracking enabled, but not a step in any funnel. Place it later by passing its id in a conditional split''s `branches[].page_id`, a split test''s fresh-variant slot, an update swap (`funnel.show_page_step_id`), or the funnel `attach_page` flow. SDK checkout and form submission require placement and return a `page_not_in_funnel` error until the page is a funnel step.
- Provide `funnel.funnel_id` OR `funnel.show_page_step_id` to create it inside a funnel in one call.
**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.
- Positioning params without their funnel target return 422: `sort_order` requires `funnel.funnel_id`, and `funnel.after_show_page_step_id` requires `funnel.funnel_id`.
**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`, `show_page_step.bumps`. Attach products and order bumps in a follow-up `PATCH /api/v2/pages/:id`.
**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.
The [Create an External Page Skill](https://accounts.myclickfunnels.com/.well-known/sdk/create-external-page/skill.md) is the end-to-end guide for the page itself. To sell products from that page, see [Add Checkout to an External Page](https://accounts.myclickfunnels.com/.well-known/sdk/add-checkout/skill.md).
'
operationId: createExternalPage
externalDocs:
description: SDK Skill - create an external page
url: https://accounts.myclickfunnels.com/.well-known/sdk/create-external-page/skill.md#the-entire-public-surface
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
requestBody:
description: Information about the external page to create
required: true
content:
application/json:
schema:
type: object
required:
- page
properties:
page:
type: object
required:
- external_url
properties:
name:
type: string
description: Page name. Defaults to the URL host if omitted.
description:
type:
- string
- 'null'
description: A short description of the page (max 1000 characters).
external_url:
type: string
description: 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:
type: integer
description: Optional zero-based position within the funnel when using `funnel.funnel_id` (422 without it). `0` inserts before the first step; omit to append. Ignored when `funnel.show_page_step_id` is used.
funnel:
type: object
description: Optional funnel association — provide either `funnel_id` or `show_page_step_id`. Omit the whole block to create a standalone external page (no funnel step).
properties:
funnel_id:
type: string
description: The public ID of the funnel to attach this page to.
after_show_page_step_id:
type:
- integer
- string
description: '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`.'
show_page_step_id:
type:
- integer
- string
description: The ID of an existing show page step to swap this page onto.
example:
page:
name: My External Landing Page
external_url: https://acme.example.com/my-page
funnel:
funnel_id: xyz789
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/PageAttributes'
example:
id: 71
public_id: ExtPgY
workspace_id: 42000
name: My External Landing Page
description: null
theme_id: null
seo_title: null
seo_description: null
seo_index: false
created_at: '2025-01-01T00:00:00.000Z'
updated_at: '2025-01-01T00:00:00.000Z'
type: funnel_page
current_path: null
url: https://acme.example.com/my-page
show_page_step:
id: 201
public_id: StpExt
name: My External Landing Page
current_path: null
sort_order: 0
products: []
funnel:
id: 100
public_id: xyz789
name: Target Funnel
sdk:
token: cfp_abc123def456
external_url: https://acme.example.com/my-page
'400':
description: Bad Request — a referenced funnel or step id could not be resolved.
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: 'Bad request: The funnel or show_page_step with the provided ID cannot be found.'
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: API key missing or invalid
'403':
description: Forbidden — external (SDK) page access is not enabled for this workspace.
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: 'Forbidden: External (SDK) pages are in Closed Alpha. Request access at https://developers.myclickfunnels.com/page/code-support.'
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: 'Not found: Record missing'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
missing_external_url:
summary: external_url is required
value:
error: 'Request unprocessable: external_url is required for external pages.'
unknown_funnel_keys:
summary: funnel block has unsupported keys
value:
error: 'Request unprocessable: page.funnel has unsupported keys: funnelId. Accepted keys: funnel_id, show_page_step_id, after_show_page_step_id.'
positioning_without_target:
summary: positioning param without funnel.funnel_id
value:
error: 'Request unprocessable: funnel.after_show_page_step_id requires funnel.funnel_id; omit the funnel block to create a standalone external page.'
rejected_fields:
summary: forbidden fields present
value:
error: 'Request unprocessable: The following fields are not valid for external pages: markup, theme_id.'
out_of_bounds_sort_order:
summary: sort_order out of bounds
value:
error: 'Request unprocessable: sort_order 5 is out of bounds (funnel has 3 step(s)).'
malformed_external_url:
summary: external_url is not a valid URL
value:
error: 'Request unprocessable: Validation failed: URL is not a valid URL (expected something like https://example.com/my-page)'
duplicate_url:
summary: external_url already in use
value:
error: 'Request unprocessable: Validation failed: URL is already in use by another external page in this workspace'
/pages/{id}:
get:
tags:
- Page
summary: Fetch Page
description: Page offers extra information about ClickFunnels pages, like those that are part of funnels.
operationId: getPages
parameters:
- $ref: '#/components/parameters/id'
- $ref: '#/components/parameters/ExpandPageFields'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/PageAttributes'
example:
id: 63
public_id: iUMTqF
workspace_id: 42000
name: Great Page
theme_id: null
created_at: '2025-01-01T00:00:00.000Z'
updated_at: '2025-01-01T00:00:00.000Z'
type: funnel_page
current_path: /great-page-canonical
url: https://myteam.myclickfunnels.com/great-page
show_page_step:
id: 150
public_id: StpAbc
name: Great Page Step
current_path: /great-page
sort_order: 0
products: []
funnel:
id: 75
public_id: FnlDef
name: Great Funnel
sdk: null
description: null
seo_description: null
seo_index: false
seo_title: null
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: API key missing or invalid
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: 'Not found: Record missing'
put:
tags:
- Page
summary: Update Page
description: '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.
**`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 the page''s entire tree. 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](https://accounts.myclickfunnels.com/.well-known/page-markup/skill.md#stop-get-approval-before-overwriting-an-existing-page).
To move externally-hosted pages to a new domain, see [Patch one page at a time](https://accounts.myclickfunnels.com/.well-known/sdk/migrate-external-page-domain/skill.md#4-patch-one-page-at-a-time) in the [Migrate an External Page Domain Skill](https://accounts.myclickfunnels.com/.well-known/sdk/migrate-external-page-domain/skill.md).
'
operationId: updatePages
externalDocs:
description: Pages Skill - building a page (PML body)
url: https://accounts.myclickfunnels.com/.well-known/pages/skill.md#building-a-page
parameters:
- $ref: '#/components/parameters/id'
- $ref: '#/components/parameters/ExpandPageFields'
requestBody:
description: Information about updated fields in Page
required: true
content:
application/json:
schema:
type: object
properties:
page:
type: object
$ref: '#/components/schemas/PageParametersUpdate'
example:
page:
name: Example Page
description: Updated page description
seo_title: Updated SEO Title
seo_description: Updated meta description
seo_index: true
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
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/PageAttributes'
example:
id: 66
public_id: ZkTthQ
workspace_id: 42000
name: Updated Page
theme_id: null
created_at: '2025-01-01T00:00:00.000Z'
updated_at: '2025-01-01T00:00:00.000Z'
type: funnel_page
current_path: /updated-page-canonical
url: https://myteam.myclickfunnels.com/updated-page
show_page_step:
id: 160
public_id: StpUpd
name: Updated Page Step
current_path: /updated-page
sort_
# --- truncated at 32 KB (84 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/clickfunnels/refs/heads/main/openapi/clickfunnels-page-api-openapi.yml