# ClickFunnels 2.0 Documentation > The CF2 API allows users to integrate with their ClickFunnels 2.0 accounts to interact with funnels, contacts, webhooks, and more. ## Guides - [Welcome](https://developers.myclickfunnels.com/docs/intro.md): Introduction into the ClickFunnels API. - [Getting Started](https://developers.myclickfunnels.com/docs/getting-started.md): Making your first request. - [OAuth 2.0](https://developers.myclickfunnels.com/docs/oauth-20.md) - [SSO](https://developers.myclickfunnels.com/docs/sso.md): Authenticating ClickFunnels contacts from your platform via a JWT token. - [Integrate With Us](https://developers.myclickfunnels.com/docs/integrate-with-us.md) - [Authentication](https://developers.myclickfunnels.com/docs/authentication.md) - [Rate Limiting](https://developers.myclickfunnels.com/docs/rate-limiting.md) - [Requests and Responses](https://developers.myclickfunnels.com/docs/requests-and-responses.md): Learn how the ClickFunnels API accepts requests and sends back responses - [Filtering](https://developers.myclickfunnels.com/docs/filtering.md): Learn all about ClickFunnels filters and common gotchas. - [Pagination](https://developers.myclickfunnels.com/docs/pagination.md) - [Time Zones](https://developers.myclickfunnels.com/docs/timezones.md): Everything you need to know about reading and passing time zones in the ClickFunnels API. - [Expand Responses](https://developers.myclickfunnels.com/docs/expand.md) - [Orders Overview](https://developers.myclickfunnels.com/docs/orders.md): ClickFunnels orders enable customers to purchase products and subscriptions through funnels, manual orders and the public API. - [Fulfillments](https://developers.myclickfunnels.com/docs/fulfillments.md): Fulfillments allow fulfilling orders. - [Products](https://developers.myclickfunnels.com/docs/products.md) - [Filtering by page](https://developers.myclickfunnels.com/docs/filtering-by-page.md): Get the right page name or page ID that you want to filter for. - [How to Work with Webhooks](https://developers.myclickfunnels.com/docs/webhooks.md): Everything you need to get going with webhooks. - [Webhook Event Types](https://developers.myclickfunnels.com/docs/webhook-event-types.md): Understand the types of available webhook events and their data payloads. - [Signature Verification](https://developers.myclickfunnels.com/docs/signature-verification.md): Learn how to securely verify signatures of webhook events that you receive from ClickFunnels. - [No-Code and Low-Code](https://developers.myclickfunnels.com/docs/no-code-and-low-code.md): You don't need code for all your business automations. ## API Reference - [List Teams](https://developers.myclickfunnels.com/reference/listteams.md): List all teams for the current account - [Fetch Team](https://developers.myclickfunnels.com/reference/fetchteam.md): Retrieve a single team - [Update Team](https://developers.myclickfunnels.com/reference/updateteam.md): List all teams for the current account - [List Users](https://developers.myclickfunnels.com/reference/listusers.md): List users for the current account. Note: an OAuth/API integration authenticates as a **platform-agent user** (e.g. "Default API Client"), so this endpoint is scoped to that agent and typically returns only it — it is **not** the way to enumerate the human team members. To find real team members (for example a workflow `notify_step`'s `user_ids`), use `GET /api/v2/teams/{team_id}/memberships` and read each membership's `user_id` (`notify_step` only accepts non-platform team members). - [Fetch User](https://developers.myclickfunnels.com/reference/fetchuser.md): Retrieve a single user - [Fetch My User](https://developers.myclickfunnels.com/reference/fetchmyuser.md): This endpoint returns the user data for the currently authenticated user. It is useful for quickly retrieving user information without knowing the user ID. It also includes optional data if the current user is a platform agent. - [List Workspaces](https://developers.myclickfunnels.com/reference/listworkspaces.md): List workspaces for a team - [Fetch Workspace](https://developers.myclickfunnels.com/reference/getworkspaces.md): Retrieve a workspace - [Update Workspace](https://developers.myclickfunnels.com/reference/updateworkspaces.md): Update a workspace - [Fetch Site](https://developers.myclickfunnels.com/reference/getsite.md): Fetch the site for a workspace. Sites contain global code settings that apply to all pages and funnels. - [Update Site](https://developers.myclickfunnels.com/reference/updatesite.md): Update the site for a workspace. You can use head_code and footer_code parameters to inject custom code. Use head_code_mode and footer_code_mode to control whether code is appended or replaced. - [List Countries](https://developers.myclickfunnels.com/reference/listaddressescountries.md): List all countries, each with its ISO 3166-1 alpha-2 code (iso2). Use a country's iso2 as the country_code when setting an address, and as the {country_id} path segment when listing its regions. - [Get Country](https://developers.myclickfunnels.com/reference/getaddressescountries.md): Retrieve a single country by its ISO 3166-1 alpha-2 code. - [List Country Regions](https://developers.myclickfunnels.com/reference/listaddressescountriesregions.md): List the regions (states/provinces) of a country. Use a region's `code` or `name` as the address `region` value. Many countries have no regions. - [List Scheduled Events](https://developers.myclickfunnels.com/reference/listappointmentsscheduledevents.md): List Scheduled Events - [List Blogs](https://developers.myclickfunnels.com/reference/listblogs.md): List blogs for the given workspace. - [Fetch Blog](https://developers.myclickfunnels.com/reference/getblog.md): Retrieve a blog. - [Update Blog](https://developers.myclickfunnels.com/reference/updateblog.md): Update a blog's metadata. Permitted fields: `name`, `seo_title`, `seo_description`, `seo_image_id`, `theme_id`. See [Update blog metadata](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md#update-blog-metadata) in the [Blogs Skill](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md). For appearance and templates, see [Configure blog appearance with existing Theme and Page APIs](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md#configure-blog-appearance-with-existing-theme-and-page-apis). - [List Blog Authors](https://developers.myclickfunnels.com/reference/listblogsauthors.md): List the authors within the given blog. - [Fetch Blog Author](https://developers.myclickfunnels.com/reference/getblogauthor.md): Retrieve a blog author. - [List Blog Categories](https://developers.myclickfunnels.com/reference/listblogscategories.md): List the categories within the given blog. - [Fetch Blog Category](https://developers.myclickfunnels.com/reference/getblogcategory.md): Retrieve a blog category. - [List Blog Posts](https://developers.myclickfunnels.com/reference/listblogsposts.md): List posts for the given blog. When importing content from an external source, page through this list first so you do not create a duplicate post, see [Discover the destination and check for duplicates](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#4-discover-the-destination-and-check-for-duplicates) in the [Import External Blog Post Skill](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md). - [Create Blog Post](https://developers.myclickfunnels.com/reference/createblogpost.md): Create a new post within the given blog. Pass `markup` to set the post's visual content via PML. Invalid markup returns 400 and the post is not created. Pass `expand[]=markup` to have the markup returned in the response. See [Creating a blog post](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md#creating-a-blog-post) in the [Blogs Skill](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md) for the permitted fields and the publish-state rules. To copy an article in from an RSS/Atom feed or an external page, follow [Normalize external HTML for PML](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#3-normalize-external-html-for-pml) and [Create a draft](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#5-create-a-draft) in the [Import External Blog Post Skill](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md). - [Fetch Blog Post](https://developers.myclickfunnels.com/reference/getblogpost.md): Retrieve a blog post. - [Update Blog Post](https://developers.myclickfunnels.com/reference/updateblogpost.md): Update a blog post. Pass `markup` to update the post's visual content via PML. It replaces the whole body, and PML covers only a subset of what the ClickFunnels editor can build, so if this post could have been written 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). Omit `markup` to change only metadata. Invalid markup returns 400 and neither the post metadata nor the markup is saved. Pass `expand[]=markup` to have the markup returned in the response. See [Updating a blog post](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md#updating-a-blog-post) in the [Blogs Skill](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md). To publish a draft, see [Publish separately](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#7-publish-separately) and [Two gotchas worth knowing](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md#two-gotchas-worth-knowing). - [Delete Blog Post](https://developers.myclickfunnels.com/reference/deleteblogpost.md): Delete a blog post. This is a hard delete; the post and its associated authorships, taggings, applied categories, and publish actions are removed. Deleting example or stock posts while migrating content in is a separate step, see [Optional cleanup of confirmed example posts](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#optional-cleanup-of-confirmed-example-posts) in the [Import External Blog Post Skill](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md). - [List Blog Tags](https://developers.myclickfunnels.com/reference/listblogstags.md): List tags for the given blog. - [Create Blog Tag](https://developers.myclickfunnels.com/reference/createblogtag.md): Create a new tag within the given blog. - [Fetch Blog Tag](https://developers.myclickfunnels.com/reference/getblogtag.md): Retrieve a blog tag. - [List Communities](https://developers.myclickfunnels.com/reference/listcommunities.md): List communities for a workspace - [Create Community](https://developers.myclickfunnels.com/reference/createcommunities.md): Create a community for a workspace - [Fetch Community](https://developers.myclickfunnels.com/reference/getcommunities.md): Retrieve a community - [Update Community](https://developers.myclickfunnels.com/reference/updatecommunities.md): Update a community - [List Space Groups](https://developers.myclickfunnels.com/reference/listcommunitiesspacegroups.md): List space groups for a community - [Create Space Group](https://developers.myclickfunnels.com/reference/createcommunitiesspacegroups.md): Create a space group within a community - [Fetch Space Group](https://developers.myclickfunnels.com/reference/getcommunitiesspacegroups.md): Retrieve a space group - [Update Space Group](https://developers.myclickfunnels.com/reference/updatecommunitiesspacegroups.md): Update a space group - [Remove Space Group](https://developers.myclickfunnels.com/reference/removecommunitiesspacegroups.md): Delete a space group - [List Spaces](https://developers.myclickfunnels.com/reference/listcommunitiesspaces.md): List spaces within a space group - [Create Space](https://developers.myclickfunnels.com/reference/createcommunitiesspaces.md): Create a space within a space group - [Fetch Space](https://developers.myclickfunnels.com/reference/getcommunitiesspaces.md): Retrieve a space - [Update Space](https://developers.myclickfunnels.com/reference/updatecommunitiesspaces.md): Update a space - [Remove Space](https://developers.myclickfunnels.com/reference/removecommunitiesspaces.md): Delete a space - [List Posts](https://developers.myclickfunnels.com/reference/listcommunitiesspacesposts.md): List posts for a space - [Create Post](https://developers.myclickfunnels.com/reference/createcommunitiesspacesposts.md): Create a post in a space. Posts created via the API are auto-approved. The `contact_id` is optional and defaults to the connected user's own contact. - [Fetch Post](https://developers.myclickfunnels.com/reference/getcommunitiesspacesposts.md): Retrieve a post - [Update Post](https://developers.myclickfunnels.com/reference/updatecommunitiesspacesposts.md): Update a post. The `contact_id` field is ignored on update. - [Remove Post](https://developers.myclickfunnels.com/reference/removecommunitiesspacesposts.md): Delete a post - [Approve Post](https://developers.myclickfunnels.com/reference/approvecommunitiesspacespost.md): Approve a post. Sets `approved_at` to the current time, applies any pending draft edit to the live body, and notifies any contacts mentioned in the post body. - [Decline Post](https://developers.myclickfunnels.com/reference/declinecommunitiesspacespost.md): Decline a post. Sets `declined_at` to the current time, marking the post as rejected and hiding it from the community feed. - [Dismiss Reports on Post](https://developers.myclickfunnels.com/reference/dismissreportscommunitiesspacespost.md): Dismiss all pending moderation reports on a post. Clears the report flags and approves the post, making it visible in the community feed. - [Pin Post](https://developers.myclickfunnels.com/reference/pincommunitiesspacespost.md): Pin a post. Sets `is_pinned` to true, causing the post to appear at the top of the community space feed. - [Unpin Post](https://developers.myclickfunnels.com/reference/unpincommunitiesspacespost.md): Unpin a post. Sets `is_pinned` to false, removing the post from the pinned section at the top of the community space feed. - [List Comments](https://developers.myclickfunnels.com/reference/listcommunitiesspacespostscomments.md): List comments for a post - [Create Comment](https://developers.myclickfunnels.com/reference/createcommunitiesspacespostscomments.md): Create a comment on a post. Comments created via the API are auto-approved. The `contact_id` is optional and defaults to the connected user's own contact. Use `parent_comment_id` for threaded replies. - [Approve Comment](https://developers.myclickfunnels.com/reference/approvecommunitiesspacespostscomment.md): Approve a comment. Sets `approved_at` to the current time and applies any pending draft edit to the live body. - [Decline Comment](https://developers.myclickfunnels.com/reference/declinecommunitiesspacespostscomment.md): Decline a comment. Sets `declined_at` to the current time, marking it as rejected. - [Dismiss Comment Reports](https://developers.myclickfunnels.com/reference/dismissreportscommunitiesspacespostscomment.md): Clear the comment's report flags (reported_at, report_count, report_type) and approve it. - [Fetch Comment](https://developers.myclickfunnels.com/reference/getcommunitiesspacespostscomments.md): Retrieve a comment - [Update Comment](https://developers.myclickfunnels.com/reference/updatecommunitiesspacespostscomments.md): Update a comment. The `contact_id` and `parent_comment_id` fields are ignored on update. - [Remove Comment](https://developers.myclickfunnels.com/reference/removecommunitiesspacespostscomments.md): Delete a comment - [List Post Likes](https://developers.myclickfunnels.com/reference/listcommunitiesspacespostslikes.md): List likes for a post - [Create Post Like](https://developers.myclickfunnels.com/reference/createcommunitiesspacespostslikes.md): Like a post. The `contact_id` is optional and defaults to the connected user's own contact. - [Remove Post Like](https://developers.myclickfunnels.com/reference/removecommunitiesspacespostslikes.md): Unlike a post by deleting the like record - [List Comment Likes](https://developers.myclickfunnels.com/reference/listcommunitiesspacespostscommentslikes.md): List likes for a comment - [Create Comment Like](https://developers.myclickfunnels.com/reference/createcommunitiesspacespostscommentslikes.md): Like a comment. The `contact_id` is optional and defaults to the connected user's own contact. - [Remove Comment Like](https://developers.myclickfunnels.com/reference/removecommunitiesspacespostscommentslikes.md): Unlike a comment by deleting the like record - [List Video Embeds](https://developers.myclickfunnels.com/reference/listcommunitiesspacespostsvideoembeds.md): List video embeds for a post - [Create Video Embed](https://developers.myclickfunnels.com/reference/createcommunitiesspacespostsvideoembeds.md): Attach a video embed to a post. The `url` field is required. - [Fetch Video Embed](https://developers.myclickfunnels.com/reference/getcommunitiesspacespostsvideoembeds.md): Retrieve a video embed - [Remove Video Embed](https://developers.myclickfunnels.com/reference/removecommunitiesspacespostsvideoembeds.md): Delete a video embed from a post - [List Memberships](https://developers.myclickfunnels.com/reference/listcommunitiesmemberships.md): List memberships for a community - [Create Membership](https://developers.myclickfunnels.com/reference/createcommunitiesmemberships.md): Add a contact as a member of a community - [Fetch Membership](https://developers.myclickfunnels.com/reference/getcommunitiesmemberships.md): Retrieve a community membership - [Update Membership](https://developers.myclickfunnels.com/reference/updatecommunitiesmemberships.md): Update a community membership (e.g. moderator status or space memberships) - [Remove Membership](https://developers.myclickfunnels.com/reference/removecommunitiesmemberships.md): Remove a contact's membership from a community. This also removes the contact from all Spaces within the community. - [List Bans](https://developers.myclickfunnels.com/reference/listcommunitiesbans.md): List bans for a community - [Create Ban](https://developers.myclickfunnels.com/reference/createcommunitiesbans.md): Ban a contact from a community - [Fetch Ban](https://developers.myclickfunnels.com/reference/getcommunitiesbans.md): Retrieve a community ban - [Remove Ban](https://developers.myclickfunnels.com/reference/removecommunitiesbans.md): Unban a contact from a community - [Create Membership Ban Action](https://developers.myclickfunnels.com/reference/createcommunitiesmembershipsbanactions.md): Enqueue an async background job to ban one or more community members. The action record is returned immediately with `status: queued`. Poll `GET /communities/memberships/ban_actions/{id}` until `status` is `completed`. - [Fetch Membership Ban Action](https://developers.myclickfunnels.com/reference/getcommunitiesmembershipsbanactions.md): Retrieve the current status of a membership ban action. Poll this endpoint until `status` is `completed`. - [Create Membership Add-To-Group Action](https://developers.myclickfunnels.com/reference/createcommunitiesmembershipsaddtogroupactions.md): Enqueue an async background job to add one or more community members to one or more spaces (groups). The action record is returned immediately with `status: queued`. Poll `GET /communities/memberships/add_to_group_actions/{id}` until `status` is `completed`. - [Fetch Membership Add-To-Group Action](https://developers.myclickfunnels.com/reference/getcommunitiesmembershipsaddtogroupactions.md): Retrieve the current status of a membership add-to-group action. Poll this endpoint until `status` is `completed`. - [Create Membership Remove-From-Group Action](https://developers.myclickfunnels.com/reference/createcommunitiesmembershipsremovefromgroupactions.md): Enqueue an async background job to remove one or more community members from one or more spaces (groups). The action record is returned immediately with `status: queued`. Poll `GET /communities/memberships/remove_from_group_actions/{id}` until `status` is `completed`. - [Fetch Membership Remove-From-Group Action](https://developers.myclickfunnels.com/reference/getcommunitiesmembershipsremovefromgroupactions.md): Retrieve the current status of a membership remove-from-group action. Poll this endpoint until `status` is `completed`. - [List Membership Export Actions](https://developers.myclickfunnels.com/reference/listcommunitiesmembershipsexportactions.md): List previous membership export actions for a community - [Create Membership Export Action](https://developers.myclickfunnels.com/reference/createcommunitiesmembershipsexportactions.md): Enqueue an async background job to export community membership data to a file. The action record is returned immediately with `status: queued`. Poll `GET /communities/memberships/export_actions/{id}` until `status` is `completed`. - [Fetch Membership Export Action](https://developers.myclickfunnels.com/reference/getcommunitiesmembershipsexportactions.md): Retrieve the current status of a membership export action. Poll this endpoint until `status` is `completed`. - [Create Ban Unban Action](https://developers.myclickfunnels.com/reference/createcommunitiesbansunbanactions.md): Enqueue an async background job to unban one or more contacts from a community. The action record is returned immediately with `status: queued`. Poll `GET /communities/bans/unban_actions/{id}` until `status` is `completed`. - [Fetch Ban Unban Action](https://developers.myclickfunnels.com/reference/getcommunitiesbansunbanactions.md): Retrieve the current status of a ban unban action. Poll this endpoint until `status` is `completed`. - [List Ban Export Actions](https://developers.myclickfunnels.com/reference/listcommunitiesbansexportactions.md): List previous ban export actions for a community - [Create Ban Export Action](https://developers.myclickfunnels.com/reference/createcommunitiesbansexportactions.md): Enqueue an async background job to export community ban data to a file. The action record is returned immediately with `status: queued`. Poll `GET /communities/bans/export_actions/{id}` until `status` is `completed`. - [Fetch Ban Export Action](https://developers.myclickfunnels.com/reference/getcommunitiesbansexportactions.md): Retrieve the current status of a ban export action. Poll this endpoint until `status` is `completed`. - [List Contacts](https://developers.myclickfunnels.com/reference/listcontacts.md): List contacts for the given workspace. By default, only identified contacts are shown so you won't see anonymous or GDPR-redacted contacts. - [Create Contact](https://developers.myclickfunnels.com/reference/createcontacts.md): Add a new contact to the workspace - [Fetch Contact](https://developers.myclickfunnels.com/reference/getcontacts.md): Retrieve a contact - [Update Contact](https://developers.myclickfunnels.com/reference/updatecontacts.md): Update a contact - [Remove Contact](https://developers.myclickfunnels.com/reference/removecontacts.md): Delete a contact - [Redact Contact](https://developers.myclickfunnels.com/reference/gdpr_destroycontacts.md): This will destroy all personally identifiable information for a contact, including their name and phone number, but does not delete the contact record itself. This cannot be undone. - [Upsert a Contact](https://developers.myclickfunnels.com/reference/upsertcontacts.md): Creates or updates a Contact, matching on the email address. If the Contact does not exist, it will be created. If the Contact does exist, it will be updated. It is not possible to delete a Contact via this endpoint. It is not possible to reset properties of a Contact by passing empty values. E.g. passing `null` for `first_name` or an empty array for `tag_ids` won't update previous values. To do that you would instead need to use the `Update Contact` endpoint. - [List Applied Tags](https://developers.myclickfunnels.com/reference/listcontactsappliedtags.md): List the applied tags for a contact - [Create Applied Tag](https://developers.myclickfunnels.com/reference/createcontactsappliedtags.md): Assign a tag to a contact by creating an applied tag - [Fetch Applied Tag](https://developers.myclickfunnels.com/reference/getcontactsappliedtags.md): Retrieve an applied tag for a contact - [Remove Applied Tag](https://developers.myclickfunnels.com/reference/removecontactsappliedtags.md): Remove a tag from a contact by deleting an applied tag - [Generate a Contact Filter](https://developers.myclickfunnels.com/reference/generatecontactfilter.md): Translates a natural-language audience description into a ClickFunnels contact filter using an AI model. The response always includes the same key set: a `stable_id` token, a structured `filter` object, and the identity fields `id`, `public_id`, `workspace_id`, and `name`. When `save: true` is supplied the filter is persisted as a reusable `Refine::StoredFilter` and those identity fields are populated; otherwise they are `null`. A saved filter can be fetched later via `GET /api/v2/contacts/filters/{id}`. Pass the returned `stable_id` to `GET /api/v2/workspaces/{workspace_id}/contacts` as the value of the `stable_id` query parameter. Keep it opaque and let the HTTP client encode the complete parameter value; with curl, use `-G --data-urlencode "stable_id=$STABLE_ID"`. Do not decode it or interpolate it directly into a raw URL. Alternatively, pass the returned `id` as `stored_filter_id` (requires `save: true`). The `stable_id` token uses the standard gzip+base64 Refine full-state format — the same format the server-rendered filter UI produces and consumes — making tokens fully interoperable between the API and the HTML filter UI. Although this is a POST, generating a filter persists nothing, so a token with read-only access to the Contacts category may call it (the `stable_id` it returns is usable against read endpoints like the contacts index). Passing `save: true` persists a stored filter and requires write access. See [Generate a contact filter from plain English](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#generate-a-contact-filter-from-plain-english) in the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md) for a worked request and for managing a saved filter afterwards. - [Get a Contact Filter](https://developers.myclickfunnels.com/reference/getcontactfilter.md): Fetches a previously saved contact filter by id. This route is shallow — the workspace is resolved from the filter itself, so no `workspace_id` is required in the path. Use the `id` (or `public_id`) returned by `POST /api/v2/workspaces/{workspace_id}/contacts/filters` with `save: true`. Returns the same resource shape as the generate endpoint, with the identity fields populated. The `stable_id` is re-derived from the saved filter. To apply it on the contacts index, keep it opaque and let the HTTP client encode the complete `stable_id` query parameter value; with curl, use `-G --data-urlencode "stable_id=$STABLE_ID"`. - [List Tags](https://developers.myclickfunnels.com/reference/listcontactstags.md): List all Contact Tags for your workspace - [Create Tag](https://developers.myclickfunnels.com/reference/createcontactstags.md): Add a new Contact Tag to your Workspace - [Fetch Tag](https://developers.myclickfunnels.com/reference/getcontactstags.md): Retrieve a single Contact Tag - [Update Tag](https://developers.myclickfunnels.com/reference/updatecontactstags.md): Update a Contact Tag - [Remove Tag](https://developers.myclickfunnels.com/reference/removecontactstags.md): Delete a Contact Tag from your workspace - [List Tag Actions](https://developers.myclickfunnels.com/reference/listcontactstagactions.md): List all Contact Tag Actions for your workspace - [Create Tag Action](https://developers.myclickfunnels.com/reference/createcontactstagactions.md): Bulk-apply or bulk-remove one or more Contact Tags across a filtered set of contacts. The action runs asynchronously — poll the returned record with `GET /api/v2/contacts/tag_actions/{id}` to track progress via `target_count` and `performed_count`. Exactly one target selection must be supplied: `stable_id`, `stored_filter_id` (alias `filter_id`), `target_ids`, or `target_all`. Returns 422 if none is provided or if the supplied value is invalid. - [Fetch Tag Action](https://developers.myclickfunnels.com/reference/getcontactstagactions.md): Retrieve a single Contact Tag Action and its current async progress - [Remove Tag Action](https://developers.myclickfunnels.com/reference/removecontactstagactions.md): Delete a Contact Tag Action record - [List Enroll Actions](https://developers.myclickfunnels.com/reference/listcontactsenrollactions.md): List all Contact Enroll Actions for your workspace - [Create Enroll Action](https://developers.myclickfunnels.com/reference/createcontactsenrollactions.md): Bulk-enroll a collection of contacts into course sections. Pass `course_ids` to enroll in every section of those courses, or `section_ids` for specific sections (or both). The action runs asynchronously — poll the returned record with `GET /api/v2/contacts/enroll_actions/{id}` to track progress via `target_count` and `performed_count`. Exactly one target selection must be supplied: `stable_id`, `stored_filter_id` (alias `filter_id`), `target_ids`, or `target_all`. Returns 422 if none is provided or if the supplied value is invalid. The `course_ids` and `section_ids` you target come from the course content tree; see [Reading back a course](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#reading-back-a-course) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md). - [Fetch Enroll Action](https://developers.myclickfunnels.com/reference/getcontactsenrollactions.md): Retrieve a single Contact Enroll Action and its current async progress - [Remove Enroll Action](https://developers.myclickfunnels.com/reference/removecontactsenrollactions.md): Delete a Contact Enroll Action record - [List Run Workflow Actions](https://developers.myclickfunnels.com/reference/listcontactsrunworkflowactions.md): List all Contact Run Workflow Actions for your workspace - [Create Run Workflow Action](https://developers.myclickfunnels.com/reference/createcontactsrunworkflowactions.md): Run a workflow against a collection of contacts. Requires `workflow_id`. Set `force_run: true` to re-enqueue contacts already in the workflow. The action runs asynchronously — poll the returned record with `GET /api/v2/contacts/run_workflow_actions/{id}` to track progress via `target_count` and `performed_count`. Exactly one target selection must be supplied: `stable_id`, `stored_filter_id` (alias `filter_id`), `target_ids`, or `target_all`. Returns 422 if none is provided or if the supplied value is invalid. To enroll a single contact instead of an audience, use `POST /workflows/{workflow_id}/runs` ([manual enrollment](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#runs---manual-enrollment)). See the [Workflows Skill](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md) for building the target workflow and [Enabling, disabling](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#enabling-disabling) for taking it live. - [Fetch Run Workflow Action](https://developers.myclickfunnels.com/reference/getcontactsrunworkflowactions.md): Retrieve a single Contact Run Workflow Action and its current async progress - [Remove Run Workflow Action](https://developers.myclickfunnels.com/reference/removecontactsrunworkflowactions.md): Delete a Contact Run Workflow Action record - [List Unsubscribe Actions](https://developers.myclickfunnels.com/reference/listcontactsunsubscribeactions.md): List all Contact Unsubscribe Actions for your workspace - [Create Unsubscribe Action](https://developers.myclickfunnels.com/reference/createcontactsunsubscribeactions.md): Bulk-unsubscribe a collection of contacts from email. The action runs asynchronously — poll the returned record with `GET /api/v2/contacts/unsubscribe_actions/{id}` to track progress via `target_count` and `performed_count`. Exactly one target selection must be supplied: `stable_id`, `stored_filter_id` (alias `filter_id`), `target_ids`, or `target_all`. Returns 422 if none is provided or if the supplied value is invalid. - [Fetch Unsubscribe Action](https://developers.myclickfunnels.com/reference/getcontactsunsubscribeactions.md): Retrieve a single Contact Unsubscribe Action and its current async progress - [Remove Unsubscribe Action](https://developers.myclickfunnels.com/reference/removecontactsunsubscribeactions.md): Delete a Contact Unsubscribe Action record - [List Export Actions](https://developers.myclickfunnels.com/reference/listcontactsexportactions.md): List all Contact Export Actions for your workspace - [Create Export Action](https://developers.myclickfunnels.com/reference/createcontactsexportactions.md): Export a collection of contacts to a CSV file. Supply `fields` to specify which contact columns appear in the CSV (including custom attribute keys). The action runs asynchronously — poll the returned record with `GET /api/v2/contacts/export_actions/{id}`. Once complete, `file_url` contains the download URL for the generated CSV. Exactly one target selection must be supplied: `stable_id`, `stored_filter_id` (alias `filter_id`), `target_ids`, or `target_all`. Returns 422 if none is provided or if the supplied value is invalid. - [Fetch Export Action](https://developers.myclickfunnels.com/reference/getcontactsexportactions.md): Retrieve a single Contact Export Action and its current async progress. When `completed_at` is set, `file_url` contains the CSV download URL. - [Remove Export Action](https://developers.myclickfunnels.com/reference/removecontactsexportactions.md): Delete a Contact Export Action record - [List Courses](https://developers.myclickfunnels.com/reference/listcourses.md): List courses for a team - [Fetch Course](https://developers.myclickfunnels.com/reference/getcourses.md): Retrieve a course - [Create Course](https://developers.myclickfunnels.com/reference/createcourses.md): Create a course for a team. See [Creating a course](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#creating-a-course) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md) for the permitted fields. - [Publish Course](https://developers.myclickfunnels.com/reference/publishcourse.md): Makes the course live by setting `published_at`. Pass an optional future `published_at` to schedule the publish; omit it (or leave it blank) to publish immediately. A `published_at` in the past is rejected. By default this publishes only the course record. To publish a brand-new course in one step, pass `publish_sections_and_lessons: true`. Before the `200 OK` response, the requested publish timestamp is set on the course, every eligible unpublished non-root section, and all unpublished or scheduled lessons underneath it. Drip and blocked section gates remain in effect. Section publish actions may still perform follow-up work asynchronously, and each records how many lessons it published in `published_lessons_count`. Otherwise sections and lessons stay draft until published via the `Courses::Sections::PublishAction` resource. Returns 422 if `published_at` is supplied but is not a valid ISO 8601 datetime, or if it is in the past. See [Publishing](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#publishing) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md) for the publish paths. - [Update Course](https://developers.myclickfunnels.com/reference/updatecourses.md): Update a course's settings and appearance — including its storefront image (`image_id`), title, and description. Updates are partial: only the attributes you include are changed; omitted attributes are left unchanged. See [Permitted course fields](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#permitted-course-fields) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md). - [List Enrollments](https://developers.myclickfunnels.com/reference/listcoursesenrollments.md): List enrollments for a course - [Create Enrollment](https://developers.myclickfunnels.com/reference/createcoursesenrollments.md): Add a new enrollment - [Fetch Enrollment](https://developers.myclickfunnels.com/reference/getcoursesenrollments.md): Retrieve an enrollment - [Update Enrollment](https://developers.myclickfunnels.com/reference/updatecoursesenrollments.md): Update an enrollment - [List Sections](https://developers.myclickfunnels.com/reference/listcoursessections.md): List Sections. Ordered by id ascending by default (pass sort_order=desc for descending), consistent with the pagination cursor, so following the Pagination-Next header returns every section exactly once. The list includes the course's root section - a structural container (`parent_id: null`, matching the course's `root_section_id`) that is not shown in the course builder UI; most integrations can ignore it and treat its children as the modules. Pass sort_property=sort_order for the builder's display order; note sort_order is scoped per parent, so it is not globally unique across the list (the root and each parent's first child both start at 0, tie-broken by id). See [Reading back a course](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#reading-back-a-course) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md) for the read walk. - [Fetch Section](https://developers.myclickfunnels.com/reference/getcoursessections.md): Fetch Section - [Update Section](https://developers.myclickfunnels.com/reference/updatecoursessections.md): Update Section. See [Permitted section fields (create and update)](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#permitted-section-fields-create-and-update) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md) for the writable fields. - [Create Section](https://developers.myclickfunnels.com/reference/createcoursessections.md): Add a new Section. See [Sections (modules)](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#sections-modules) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md). - [Publish Section](https://developers.myclickfunnels.com/reference/publishcoursessections.md): Makes a single section live by setting `published_at`, and cascade-publishes its lessons individually so per-lesson side effects fire. The response is the canonical section resource. If section or lesson validation fails, the entire request returns `422` without changing any publish timestamps. Pass an optional future `published_at` to schedule it; omit it to publish now. A past `published_at` is rejected. This is the default publish (`auto_enroll: false`) — to also grant existing enrollees access and notify them, use `createCoursesSectionsPublishActions` with `auto_enroll` instead. The root section cannot be published directly. See [Publishing](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#publishing) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md) for the publish paths. - [List Lessons](https://developers.myclickfunnels.com/reference/listcourseslessons.md): List Lessons. Ordered by id ascending by default (pass sort_order=desc for descending), consistent with the pagination cursor, so following the Pagination-Next header returns every lesson exactly once. Pass sort_property=sort_order for the builder's display order of lessons within the section (sort_order is scoped per section, starting at 0). - [Fetch Lesson](https://developers.myclickfunnels.com/reference/getcourseslessons.md): Fetch Lesson - [Update Lesson](https://developers.myclickfunnels.com/reference/updatecourseslessons.md): Update Lesson. See [Permitted lesson fields](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#permitted-lesson-fields) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md); the Markdown body field is `lesson_content`. - [Create Lesson](https://developers.myclickfunnels.com/reference/createcourseslessons.md): Add a new Lesson. The lesson body is authored in Markdown via `lesson_content`, not PML. See [Lessons](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#lessons) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md). - [Publish Lesson](https://developers.myclickfunnels.com/reference/publishcourseslessons.md): Makes a single lesson live by setting `published_at`. Pass an optional future `published_at` to schedule it; omit it to publish now. A past `published_at` is rejected. A lesson's `published_at` is not writable via `updateCoursesLessons`, so this is the way to publish or schedule an individual lesson. See [Publishing](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#publishing) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md) for the other publish paths. - [List Lesson Completions](https://developers.myclickfunnels.com/reference/listcourseslessoncompletions.md): List of enrollment-completion records showing which lessons have been completed by which enrollments. You can filter on one or more `enrollment_id` or `lesson_id` records (see filter params). - [Create Lesson Completion](https://developers.myclickfunnels.com/reference/createcourseslessoncompletions.md): Mark a lesson as completed by a specific enrollment. You can only mark a lesson as completed once. Subsequent completions for the same lesson by the same enrollment will return a conflict error. - [Fetch Lesson Completion](https://developers.myclickfunnels.com/reference/getcourseslessoncompletions.md): Retrieve a enrollment-lesson completion record - [Remove Lesson Completion](https://developers.myclickfunnels.com/reference/removecourseslessoncompletions.md): Unmark a lesson as completed. This action deletes the record. - [List Publish Actions](https://developers.myclickfunnels.com/reference/listcoursessectionspublishactions.md): List course-section publish actions for a course - [Create Publish Action](https://developers.myclickfunnels.com/reference/createcoursessectionspublishactions.md): Publish one or more course sections AND the lessons they contain. Provide exactly one of `target_ids` (a nonempty array of course-section public IDs) or `target_all: true` to publish every unpublished non-root section of the course. Explicit target IDs must identify sections in this course. Targeting the root "Primary module" container (or using `target_all`) expands to every unpublished non-root section. A missing or empty `courses_sections_publish_action` wrapper is a malformed request and returns `400`; a well-formed wrapper with a missing or conflicting selection, or an invalid/cross-course target ID, returns `422`. If a root or `target_all` request has no unpublished content to publish, the response is `200 OK` with a message (not an error). The action runs asynchronously — poll with `GET /api/v2/courses/sections/publish_actions/{id}`. The `status` field is `queued`, `scheduled`, or `processing` while work remains and `completed` when it is done. Compare `performed_count` to `target_count` for section progress. `published_lessons_count` reports lesson publish states this action changed, excluding lessons already live. Set `auto_enroll: true` to grant existing course enrollees access to the newly published sections. Pair with `send_email: true` to notify them. Use `scheduled_for` (ISO 8601, must be a future datetime) to defer the publish. See [Publishing](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#publishing) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md) for when this bulk action is the right choice. - [Fetch Publish Action](https://developers.myclickfunnels.com/reference/getcoursessectionspublishactions.md): Retrieve a single course-section publish action and its current async progress - [Remove Publish Action](https://developers.myclickfunnels.com/reference/removecoursessectionspublishactions.md): Delete a course-section publish action record - [List Discounts](https://developers.myclickfunnels.com/reference/listdiscounts.md): List the discounts in a workspace. - [Create Discount](https://developers.myclickfunnels.com/reference/creatediscounts.md): Create a discount in a workspace. A `code`-type discount (the default) needs a unique `code`; a `percentage` discount needs `percent`; a `fixed` discount needs a positive `amount`. Creating a discount publishes the code; it does not attach it to anything. The link between an order and a discount is a separate applied-discount record, written when a buyer redeems the code at checkout or when a ClickFunnels user applies it in the admin UI - which is why `POST /api/v2/workspaces/{workspace_id}/orders` takes no discount field and the `discount_ids` on an order are read-only. Writing applied discounts is not part of this API yet, and when it lands it will be that record you create rather than a discount field on the order. Until then an integration creates, reads, updates, expires and deletes discounts, and reads back which orders ended up carrying them. - [Fetch Discount](https://developers.myclickfunnels.com/reference/getdiscounts.md): Retrieve a single discount. - [Update Discount](https://developers.myclickfunnels.com/reference/updatediscounts.md): Update a discount. Money-affecting fields are locked once the discount has been redeemed and return 422, while renaming and expiring still work. A discount that is already expired freezes its other fields and returns 422, a rename included - lift the expiry with `expired: false` (the API side of Remove Expiration in the app) or push `apply_until` into the future, then make the change and expire it again. - [Remove Discount](https://developers.myclickfunnels.com/reference/removediscounts.md): Hard-delete a discount. Only a discount that has NOT been applied to an order can be deleted; a used discount returns 422 (expire it with `expired: true` instead, to preserve its order history). A discount enters that state through an applied-discount record, written when a buyer redeems the code at checkout or when a ClickFunnels user applies it in the admin UI. A code an integration created and never published carries none of those records, so it is always deletable. - [List Domains](https://developers.myclickfunnels.com/reference/listdomains.md): List all domains for a workspace. Use this endpoint to retrieve domain IDs for use with other resources such as Funnels. These are **website hosting** domains (ownership + hosting CNAME + SSL). To manage **email sending** domains (DKIM/SPF/DMARC), see the Email Domains endpoints (listEmailsDomains / createEmailsDomains). - [Fetch Domain](https://developers.myclickfunnels.com/reference/getdomain.md): Fetch a single domain by ID. - [List Downloads](https://developers.myclickfunnels.com/reference/listdownloads.md): List downloads for a workspace. Use each download's `asset_id` when configuring a product variant's digital-asset access. - [Fetch Download](https://developers.myclickfunnels.com/reference/getdownloads.md): Fetch a single download by ID, including the Asset ID used to configure product-variant access. - [List Email Addresses](https://developers.myclickfunnels.com/reference/listemailsaddresses.md): List all email addresses for a workspace. See [Addresses (pick a usable sender)](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#addresses-pick-a-usable-sender) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md) for picking one to send from. - [Create Email Address](https://developers.myclickfunnels.com/reference/createemailsaddresses.md): Create a sender ("from") email address. Provide `username` and `name` (the from-name shown on emails). By default, the address is created on ClickFunnels' shared sending domain. To use a custom domain, first provision it with `POST /workspaces/{workspace_id}/emails/domains`, add the returned DNS records, and have the customer connect that same root domain to this workspace as a website/hosting domain in the ClickFunnels app. Both halves are required and no API call can do the second one, so DNS records alone never make a domain ready. Re-check with `POST /emails/domains/{id}/verify` until `ready_for_sending` is true, then pass the domain's numeric `id` as `emails_domain_id`. An address created before the domain is ready is allowed; it simply reports `usable_as_sender: false` until then. See [Addresses (pick a usable sender)](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#addresses-pick-a-usable-sender) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md). - [Get Email Address](https://developers.myclickfunnels.com/reference/getemailsaddresses.md): Retrieve a single email address - [Update Email Address](https://developers.myclickfunnels.com/reference/updateemailsaddresses.md): Update a sender address — most commonly to change its `name` (the from-name). You may also move it to a different ready-for-sending custom domain via `emails_domain_id`. - [Archive Email Address](https://developers.myclickfunnels.com/reference/removeemailsaddresses.md): Archive (soft-delete) a sender address. Once archived the sender is treated as gone: it is excluded from the list endpoint and a subsequent GET/PATCH/DELETE on its id returns 404 (there is no un-archive endpoint). - [List Email Broadcasts](https://developers.myclickfunnels.com/reference/listemailsbroadcasts.md): List all email broadcasts for a workspace. Filterable by id and status. - [Create Email Broadcast](https://developers.myclickfunnels.com/reference/createemailsbroadcast.md): Create a new email broadcast. Broadcasts are created in DRAFT status — creating one does not send it. To send it, create a send action for the broadcast (POST /emails/broadcasts/{broadcast_id}/send_actions): omit send_at to send now, or pass a future send_at to schedule. (Alternatively, the legacy inline path accepts recipients with send_immediately=true, or send_at/send_at_local_time/time_zone to schedule.) A complete business mailing address is required even when creating a draft. Configure it first with PUT /workspaces/{workspace_id}/emails/settings; an incomplete address returns 422. When accessing the API through an OAuth connection from a third-party platform, this endpoint is restricted to trusted developer platforms. If you are using your own API key, you can send emails directly from your account. Pick from_email and reply_to_email from addresses whose top-level `usable_as_sender` is true, not from the sending domain's `verified` flag: `verified` covers email transport only, and sending a broadcast from an address that is not usable is rejected with 422. List addresses via GET /workspaces/{workspace_id}/emails/addresses. See [Broadcasts](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#broadcasts) and the [Business mailing address prerequisite](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#business-mailing-address-prerequisite) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md). - [Fetch Email Broadcast](https://developers.myclickfunnels.com/reference/getemailsbroadcast.md): Retrieve a single email broadcast by ID - [Update Email Broadcast](https://developers.myclickfunnels.com/reference/updateemailsbroadcast.md): Update an email broadcast. Only broadcasts in draft status can be updated. When accessing the API through an OAuth connection from a third-party platform, this endpoint is restricted to trusted developer platforms. If you are using your own API key, you can send emails directly from your account. See [Broadcasts](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#broadcasts) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md). - [Delete Email Broadcast](https://developers.myclickfunnels.com/reference/removeemailsbroadcast.md): Delete an email broadcast. Only broadcasts in draft status can be deleted. When accessing the API through an OAuth connection from a third-party platform, this endpoint is restricted to trusted developer platforms. If you are using your own API key, you can send emails directly from your account. - [List Send Actions](https://developers.myclickfunnels.com/reference/listemailsbroadcastssendactions.md): List all send actions for an email broadcast. Send actions represent past or scheduled delivery attempts for the broadcast. When accessing the API through an OAuth connection from a third-party platform, this endpoint is restricted to trusted developer platforms. If you are using your own API key, you can access this endpoint directly. - [Create Send Action](https://developers.myclickfunnels.com/reference/createemailsbroadcastssendactions.md): Send (or schedule) an email broadcast by creating a Send Action. This is the same trigger the ClickFunnels dashboard fires when you click "Send". The request body is optional — a bodyless POST dispatches the broadcast immediately. Pass `send_at` inside `emails_broadcasts_send_action` to schedule the broadcast for a future date and time; the broadcast will be sent at the given hour on that day, adjusted to the workspace's time zone. The broadcast must be ready to send before this call will succeed. It requires: - A topic assigned (`topic_ids` is non-empty) - A from-address with `usable_as_sender: true` - A complete workspace marketing address (set via the Email Settings endpoint) If any of these conditions are not met, the endpoint returns 422 with a message listing what is missing. The send runs asynchronously. The returned Send Action record tracks progress: poll `GET /api/v2/emails/broadcasts/send_actions/{id}` and compare `performed_count` to `target_count`. When accessing the API through an OAuth connection from a third-party platform, this endpoint is restricted to trusted developer platforms. If you are using your own API key, you can send emails directly from your account. See [Sending or scheduling a broadcast](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#sending-or-scheduling-a-broadcast) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md). - [Fetch Send Action](https://developers.myclickfunnels.com/reference/getemailsbroadcastssendactions.md): Retrieve a single send action and its current async delivery progress. Compare `performed_count` to `target_count` to determine how far along delivery is. `completed_at` is set when delivery finishes. When accessing the API through an OAuth connection from a third-party platform, this endpoint is restricted to trusted developer platforms. If you are using your own API key, you can access this endpoint directly. - [Remove Send Action](https://developers.myclickfunnels.com/reference/removeemailsbroadcastssendactions.md): Delete a send action record. This cancels a scheduled (not-yet-started) send action and removes the record. Deleting a send action that has already started or completed may not halt in-flight delivery. When accessing the API through an OAuth connection from a third-party platform, this endpoint is restricted to trusted developer platforms. If you are using your own API key, you can access this endpoint directly. - [List Email Domains](https://developers.myclickfunnels.com/reference/listemailsdomains.md): List all email sending domains (DKIM/SPF/DMARC) for a workspace. These are **email sending** domains - for website/hosting domains, see **listDomains**. Each result separates workspace ownership (`ownership_verified`) from email transport (`verified`); addresses on a custom domain can send only when `ready_for_sending` is true. Ownership comes from connecting the domain, as `www.example.com` or another subdomain of it, to this workspace as a website/hosting domain in the ClickFunnels app - no API call makes `ownership_verified` true. Return-path verification is independent of sender readiness. Reads return the stored DNS verification state and never trigger a live DNS lookup (use `verifyEmailsDomains` for that); `ownership_verified` is always current. See [Sending domains](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#sending-domains) in the Emails Skill for the complete agent workflow. - [Create Email Domain](https://developers.myclickfunnels.com/reference/createemailsdomains.md): Provision a sending domain for a workspace. Find-or-create: returns `200` with the existing record if a domain with this name already exists for the workspace, or `201` with freshly generated DNS records if it was just created. These are **email sending** domains (DKIM/SPF/DMARC) - for website/hosting domains, see **listDomains**. The response includes the email-transport records; `dkim_record` can be `null` until the DKIM key finishes generating, and POSTing the same name again retries provisioning. Provisioning also creates a `no-reply@` sender address on the new domain. When accessing the API through an OAuth connection from a third-party platform, this endpoint is restricted to trusted developer platforms; with your own API key (or an OAuth app acting on its own team's workspaces) it always passes. Follow `next_steps`, which distinguishes the required ownership step, the required transport records, and the recommended return-path record; verified SMTP replaces DKIM/SPF/DMARC. Ownership (`ownership_verified`) is proved by connecting the domain, as `www.example.com` or another subdomain of it, to this workspace as a website/hosting domain in the ClickFunnels app, not through this API. Ownership is confirmed at the root domain, so provision `example.com` rather than a subdomain such as `mail.example.com`, which is rejected with `422` naming the root domain to use instead. Then call **verifyEmailsDomains** until `ready_for_sending` is true; a `200` there means the check ran, not that it passed. The top-level `verified` field means transport only; sender readiness requires both ownership and transport. Return-path verification is independent. Once ready, create addresses via `POST /workspaces/{workspace_id}/emails/addresses` with `emails_domain_id` set to this domain's numeric `id`. - [Get Email Domain](https://developers.myclickfunnels.com/reference/getemailsdomains.md): Retrieve a single email sending domain (DKIM/SPF/DMARC), including its ownership, transport, readiness, and return-path flags plus the DNS records to add at the provider. These are **email sending** domains - for website/hosting domains, see **listDomains**. `verified` reports transport only; `ready_for_sending` requires both workspace ownership and transport, while return-path verification is independent. Ownership is confirmed by connecting the domain, as `www.example.com` or another subdomain of it, to this workspace as a website/hosting domain in the ClickFunnels app, not through this API. `dkim_record` is `null` until the DKIM key finishes generating - re-POST the same name to **createEmailsDomains** to retry provisioning. This read returns the stored DNS verification state and never triggers a live DNS lookup (use `verifyEmailsDomains` to re-check), while `ownership_verified` is always current. - [Verify Email Domain](https://developers.myclickfunnels.com/reference/verifyemailsdomains.md): Re-run the DNS checks for DKIM, SPF, DMARC, and the return path, cached for about 10 minutes, and return the refreshed status together with the current ownership state. A `200` means the check ran, not that it passed, so always read the booleans back. `verified` reports transport only and becomes true when DKIM, SPF, and DMARC are all live, or when a verified SMTP setting exists. `ownership_verified` reports workspace control of the name, which comes from connecting the domain, as `www.example.com` or another subdomain of it, to this workspace as a website/hosting domain in the ClickFunnels app rather than from any API call. `ready_for_sending` becomes true only when both are true. Return-path verification is checked but remains independent and is not required for readiness. DNS changes can take up to 48 hours to propagate. - [Get Email Settings](https://developers.myclickfunnels.com/reference/getemailssettings.md): Retrieve email settings for a workspace. A workspace that has never configured its email settings has no persisted record yet; this returns `200` with the empty settings shape (`address: null`, `address_complete: false`) rather than a `404`, signalling "not set up yet - PUT to configure". Check `address_complete` here before sending marketing email: see the [Business mailing address prerequisite](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#business-mailing-address-prerequisite) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md). - [Update Email Settings](https://developers.myclickfunnels.com/reference/updateemailssettings.md): Update a workspace's email/marketing settings. Most importantly, this sets the marketing (business) address, which is the workspace-wide prerequisite for creating broadcasts and workflow send-email steps, and for sending broadcasts. When an `address` is supplied it is validated for completeness, so a 422 here means marketing-email creation and sending remain blocked. A workspace that has never configured its email settings has no persisted record yet; the first PUT builds and persists it, so it succeeds rather than returning a `404`. See the [Business mailing address prerequisite](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#business-mailing-address-prerequisite) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md) for the exact body to send. - [List Email Templates](https://developers.myclickfunnels.com/reference/listemailstemplates.md): List all email templates for a workspace - [Fetch Email Template](https://developers.myclickfunnels.com/reference/getemailstemplate.md): Retrieve a single email template - [Create Email Template](https://developers.myclickfunnels.com/reference/createemailstemplate.md): Create an email template from html_body/text_body. The template is marked api-created and is hidden from the visual template pickers (it cannot be edited in the visual BeeFree editor). When accessing the API through an OAuth connection from a third-party platform acting on another team's workspaces, this endpoint is restricted to trusted developer platforms; if you are using your own API key (acting on your own account), you can write directly. See [Create a template](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#create-a-template) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md), including the `expand[]=html_body`/`expand[]=text_body` params that echo the body you just set back in the response. - [Update Email Template](https://developers.myclickfunnels.com/reference/updateemailstemplate.md): Update an email template. Only the provided fields are changed. Invalid Liquid in html_body is rejected with 422. When accessing the API through an OAuth connection from a third-party platform acting on another team's workspaces, this endpoint is restricted to trusted developer platforms; if you are using your own API key (acting on your own account), you can write directly. See [Update a template](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#update-a-template) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md). - [Delete Email Template](https://developers.myclickfunnels.com/reference/deleteemailstemplate.md): Delete an email template. Returns 422 if the template is shared or is in use by a workflow send-email step. When accessing the API through an OAuth connection from a third-party platform acting on another team's workspaces, this endpoint is restricted to trusted developer platforms; if you are using your own API key (acting on your own account), you can delete directly. See [Delete a template](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#delete-a-template) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md) for what makes a template undeletable. - [List Email Topics](https://developers.myclickfunnels.com/reference/listemailstopics.md): List all email topics for a workspace. Use include_archived=true to include archived topics. - [Create Email Topic](https://developers.myclickfunnels.com/reference/createemailstopic.md): Create a new email topic for a workspace - [Fetch Email Topic](https://developers.myclickfunnels.com/reference/getemailstopic.md): Retrieve a single email topic - [Update Email Topic](https://developers.myclickfunnels.com/reference/updateemailstopic.md): Update an email topic - [Archive Email Topic](https://developers.myclickfunnels.com/reference/archiveemailstopic.md): Archive an email topic. System topics cannot be archived. - [List Forms](https://developers.myclickfunnels.com/reference/listforms.md): List forms for a workspace - [Create Form](https://developers.myclickfunnels.com/reference/createforms.md): Add a new form - [Fetch Form](https://developers.myclickfunnels.com/reference/getforms.md): Retrieve a form - [Update Form](https://developers.myclickfunnels.com/reference/updateforms.md): Update a form - [Remove Form](https://developers.myclickfunnels.com/reference/removeforms.md): Delete a form - [List Field Sets](https://developers.myclickfunnels.com/reference/listformsfieldsets.md): List field sets for a form - [Create Field Set](https://developers.myclickfunnels.com/reference/createformsfieldsets.md): Add a new field set - [Fetch Field Set](https://developers.myclickfunnels.com/reference/getformsfieldsets.md): Retrieve a field set - [Update Field Set](https://developers.myclickfunnels.com/reference/updateformsfieldsets.md): Update a field set - [Remove Field Set](https://developers.myclickfunnels.com/reference/removeformsfieldsets.md): Delete a field set - [List Fields](https://developers.myclickfunnels.com/reference/listformsfields.md): List fields for a field set - [Create Field](https://developers.myclickfunnels.com/reference/createformsfields.md): Add a new field - [Fetch Field](https://developers.myclickfunnels.com/reference/getformsfields.md): Retrieve a field - [Update Field](https://developers.myclickfunnels.com/reference/updateformsfields.md): Update a field - [Remove Field](https://developers.myclickfunnels.com/reference/removeformsfields.md): Delete a field - [Reorder Fields](https://developers.myclickfunnels.com/reference/reorderformsfields.md): Reorders the fields of a field set. - [List Options](https://developers.myclickfunnels.com/reference/listformsfieldsoptions.md): List options for a field - [Create Option](https://developers.myclickfunnels.com/reference/createformsfieldsoptions.md): Add a new option to a field - [Fetch Option](https://developers.myclickfunnels.com/reference/getformsfieldsoptions.md): Retrieve a option for a field - [Update Option](https://developers.myclickfunnels.com/reference/updateformsfieldsoptions.md): Update a option for a field - [Remove Option](https://developers.myclickfunnels.com/reference/removeformsfieldsoptions.md): Delete a option for a field - [List Submissions](https://developers.myclickfunnels.com/reference/listformssubmissions.md): List submissions for a form - [Create Submission](https://developers.myclickfunnels.com/reference/createformssubmissions.md): Add a new submission to a form - [Fetch Submission](https://developers.myclickfunnels.com/reference/getformssubmissions.md): Retrieve a submission for a form - [Update Submission](https://developers.myclickfunnels.com/reference/updateformssubmissions.md): Update a submission for a form - [Remove Submission](https://developers.myclickfunnels.com/reference/removeformssubmissions.md): Delete a submission for a form - [List Answers](https://developers.myclickfunnels.com/reference/listformssubmissionsanswers.md): List answers for a submission - [Create Answer](https://developers.myclickfunnels.com/reference/createformssubmissionsanswers.md): Add a new answer to a submission - [Fetch Answer](https://developers.myclickfunnels.com/reference/getformssubmissionsanswers.md): Retrieve a answer for a submission - [Update Answer](https://developers.myclickfunnels.com/reference/updateformssubmissionsanswers.md): Update a answer for a submission - [Remove Answer](https://developers.myclickfunnels.com/reference/removeformssubmissionsanswers.md): Delete a answer for a submission - [List Form Submissions](https://developers.myclickfunnels.com/reference/listformsubmissions.md): List form submissions. This is a list of all form submissions for the workspace, including the submitted standard and custom fields. Please refer to the `Form` and `Forms::Submission` resources if you would like to submit forms programmatically. - [Fetch Form Submission](https://developers.myclickfunnels.com/reference/getformsubmissions.md): Retrieve a form submission. This is a record of a form submission, including the submitted standard and custom fields. Please refer to the `Form` and `Forms::Submission` resources if you would like to submit forms programmatically. - [List Funnels](https://developers.myclickfunnels.com/reference/listfunnels.md): List Funnels - [Create Funnel](https://developers.myclickfunnels.com/reference/createfunnel.md): Create a new funnel in the workspace. Creating a funnel automatically creates a workflow. You can then add pages to the funnel by creating pages with `funnel.funnel_id` set to the new funnel's ID (see the Create Page endpoint). **Client flow for building a funnel with pages:** 1. `POST /api/v2/workspaces/:id/funnels` — creates the funnel (workflow auto-created) 2. `POST /api/v2/workspaces/:id/pages` with `{ page: { name: "...", funnel: { funnel_id: "" }, markup: "" } }` — creates each page, auto-links it to the funnel, and applies the markup in one call 3. `PATCH /api/v2/pages/:id` with `{ page: { markup: "" } }` — applies or updates visual content (PML markup) on an existing page 4. Steps 2 and 3 can be combined: passing `markup` in the create call sets the initial visual content without a separate PATCH The internal step/workflow wiring is handled automatically — API clients never need to manage workflows or steps directly. - [Fetch Funnel](https://developers.myclickfunnels.com/reference/getfunnels.md): Fetch Funnel - [Update Funnel](https://developers.myclickfunnels.com/reference/updatefunnels.md): Update Funnel. You can use head_code and footer_code parameters to inject custom code. Use head_code_mode and footer_code_mode to control whether code is appended or replaced. - [Fetch Funnel Structure](https://developers.myclickfunnels.com/reference/getfunnelstructure.md): A funnel's steps as a single, flat, ordered list — the same top‑to‑bottom flow you see in the funnel builder. Use it to read or visualize how a funnel is laid out. Each entry in `steps` is one of three kinds: - **`show_page_step`** — a page. Includes `page` (its `name`, `url`, and the `external` / `sdk_token` flags for externally‑hosted SDK pages) and `show_page_step_id` — the id you hand back as `funnel.show_page_step_id` to swap a page onto this step. - **`split_test_step`** — an A/B test: a `variants` list, each with a `weight` and its own `steps`. - **`conditional_split_step`** — routing by a saved contact filter: a `branches` list, always `[matched, unmatched]`, each with its own `steps`. Splits can nest — a split placed inside a branch shows up inside that branch's `steps`. **Two things to know when reading it:** 1. **Follow the array order, not `sort_order`.** `sort_order` only numbers a step within its own list, so it repeats across branches and after splits — in the example below the top level runs `0, 1, 0, 1`. The array order is the real sequence. (Separately: when you *create* a step, the `sort_order` you send positions it among the funnel's top‑level steps.) 2. **Branches come back together.** A branch lists only its own steps; afterwards the flow continues at the step right after the split, and every branch ends up there. In the example below, both branches lead on to `Order Form → Thank You`. A split with nothing after it ends the funnel. The `200` example below is this funnel: ```text Entry └─ Conditional Split ├─ matched: VIP Welcome → Split Test ( Premium Offer A 50% / Premium Offer B 50% ) └─ unmatched: Guest Welcome → Conditional Split ( Returning Customer / New Customer ) → Order Form → Thank You (every path comes back together here) ``` Related: the [Pages skill](https://accounts.myclickfunnels.com/.well-known/pages/skill.md#positioning-a-page-within-a-funnel) (create, position, and swap pages) and the [Funnels skill](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md) (add split tests and conditional splits). When migrating externally-hosted pages to a new domain, this is the read that inventories them: see [Migrate an External Page Domain](https://accounts.myclickfunnels.com/.well-known/sdk/migrate-external-page-domain/skill.md#2-read-and-recursively-inventory-the-funnel). - [Fetch Funnel Stats](https://developers.myclickfunnels.com/reference/getfunnelstats.md): Retrieve detailed statistics for a funnel, including a summary of key metrics and optional per-step breakdowns of views, opt-ins, sales, and earnings. Defaults to a 30-day timerange ending now. Override with `timerange_start` and `timerange_end`. Timerange values are automatically clamped: future end dates are clamped to now, windows exceeding 90 days are clamped to 90 days, and if start is after end the window resets to 30 days ending at `timerange_end`. By default the response includes a `page_public_ids` array. Use `expand[]=steps` to receive a `steps` array with per-step metrics instead. The metric names in the response are defined in [Metric vocabulary](https://accounts.myclickfunnels.com/.well-known/stats/skill.md#metric-vocabulary) in the [Stats Skill](https://accounts.myclickfunnels.com/.well-known/stats/skill.md), which also walks a [recurring funnel auditor agent](https://accounts.myclickfunnels.com/.well-known/stats/skill.md#example-use-case---recurring-funnel-auditor-agent) built on this endpoint. - [List Conditional Split Steps](https://developers.myclickfunnels.com/reference/listfunnelconditionalsplitsteps.md): List all conditional split steps in a funnel. Each entry exposes its `condition` (filter_id + is_setup) and 2-entry `branches` array (`[matched, unmatched]`). Pass `expand[]=filter` to include the full RefineFilter object nested under `condition.filter` for each step. On the show endpoint (`GET /{id}`) the filter is always included without needing the expand param. See the [Funnels Skill](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#conditional-split-steps) for the full conditional-split surface. - [Create Conditional Split Step](https://developers.myclickfunnels.com/reference/createfunnelconditionalsplitstep.md): Add a new conditional split step to a funnel. All fields are optional — providing none creates an empty unconfigured split. Provide `condition` to set the contact filter, `branches` to attach pages to one or both branches, and/or `show_page_step_id` to position the split in the workflow. See the [Funnels Skill](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#conditional-split-steps) for the full surface. - [Fetch Conditional Split Step](https://developers.myclickfunnels.com/reference/getfunnelconditionalsplitstep.md): Fetch a single conditional split step with its branches and condition. - [Update Conditional Split Step](https://developers.myclickfunnels.com/reference/updatefunnelconditionalsplitstep.md): Update the `condition` and/or attach pages to existing `branches`. At least one of the two must be provided. - `condition.filter_id` is the public id of a RefineFilter in the same workspace. - Branches array must have 2 entries (matched, unmatched). Each entry may carry a `page_id` to attach (currently empty branch) or swap (currently populated branch). Any page being attached / swapped-in must be a fresh `user_page` in the same workspace with no existing `ShowPageStep`. - [Destroy Conditional Split Step](https://developers.myclickfunnels.com/reference/destroyfunnelconditionalsplitstep.md): Remove a conditional split from the funnel. **A 1-branch conditional split is not a supported state**, so any value of `branch` collapses the entire split: - `DELETE /funnels/{funnel_id}/conditional_split_steps/{id}` (default `branch=both`) → removes the entire conditional split, both branches discarded. - `DELETE /funnels/{funnel_id}/conditional_split_steps/{id}?branch=matched` → removes the entire conditional split; the **unmatched** branch's pages are promoted up under the split's parent so they remain attached to the funnel's main workflow. - `DELETE /funnels/{funnel_id}/conditional_split_steps/{id}?branch=unmatched` → removes the entire conditional split; the **matched** branch's pages are promoted up under the split's parent. See [Destroying a conditional split](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#destroying-a-conditional-split) in the [Funnels Skill](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md) for how the collapse fits into the rest of the conditional-split surface. - [List Split Test Steps](https://developers.myclickfunnels.com/reference/listfunnelsplitteststeps.md): List all split test steps in a funnel. Each split test wraps an existing page in a two-branch split and optionally attaches a second page. See the [Funnels Skill](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#split-test-steps) for the full split-test surface. - [Create Split Test Step](https://developers.myclickfunnels.com/reference/createfunnelsplitteststep.md): Wrap an existing page in a new split test. Provide one variant to wrap a single page (the second branch starts empty and can be attached later via PATCH), or two variants to wrap a page and attach a fresh page as the second branch. The API never clones pages — the second variant's page must not already be used by any funnel step. See the [Funnels Skill](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#split-test-steps) for the full split-test surface. - [Fetch Split Test Step](https://developers.myclickfunnels.com/reference/getfunnelsplitteststep.md): Fetch a single split test step with its variants and weights. - [Update Split Test Step](https://developers.myclickfunnels.com/reference/updatefunnelsplitteststep.md): Update a split test's variants: attach a page to an empty branch, swap an existing variant's page, or adjust the weights. The `variants` array length must equal the number of branches in the split test (2 for the standard binary case). - Weight rules: if *any* variant provides `weight`, all variants must provide it and the values must be integers 0..100 summing to 100. If *none* provide weight, weights stay unchanged. - Page-id rules per variant: - Equal to current `page_id` → no-op. - Branch currently empty + new `page_id` provided → attach. - Branch currently has a page + new different `page_id` → swap (old step destroyed). - `page_id: null` or blank is rejected (detach is out of scope — use DELETE with `branch` parameter instead). - Any page being attached/swapped-in must: (a) be in the same workspace, (b) be a `user_page`, and (c) have no existing `ShowPageStep` anywhere in any funnel. - [Destroy Split Test Step](https://developers.myclickfunnels.com/reference/destroyfunnelsplitteststep.md): Remove a split test from the funnel. **A 1-branch split test is not a supported state**, so any value of `branch` collapses the entire split: - `DELETE /funnels/{funnel_id}/split_test_steps/{id}` (default `branch=both`) → removes the entire split test, both branches discarded. - `DELETE /funnels/{funnel_id}/split_test_steps/{id}?branch=left` → removes the entire split test; the **right** branch's pages are promoted up under the split's parent so they remain attached to the funnel's main workflow. - `DELETE /funnels/{funnel_id}/split_test_steps/{id}?branch=right` → removes the entire split test; the **left** branch's pages are promoted up under the split's parent. See [Destroying a split test](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#destroying-a-split-test) in the [Funnels Skill](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md) for how the collapse fits into the rest of the split-test surface. - [List Tags](https://developers.myclickfunnels.com/reference/listfunnelstags.md): List Tags - [Create Tag](https://developers.myclickfunnels.com/reference/createfunnelstags.md): Create Tag - [Fetch Tag](https://developers.myclickfunnels.com/reference/getfunnelstags.md): Fetch Tag - [Update Tag](https://developers.myclickfunnels.com/reference/updatefunnelstags.md): Update Tag - [Remove Tag](https://developers.myclickfunnels.com/reference/removefunnelstags.md): Remove Tag - [List Images](https://developers.myclickfunnels.com/reference/listimages.md): List Images - [Create Image](https://developers.myclickfunnels.com/reference/createimages.md): Create Image - [Fetch Image](https://developers.myclickfunnels.com/reference/getimages.md): Fetch Image - [Update Image](https://developers.myclickfunnels.com/reference/updateimages.md): Update Image - [Remove Image](https://developers.myclickfunnels.com/reference/removeimages.md): Remove Image - [List Fulfillments](https://developers.myclickfunnels.com/reference/listfulfillments.md): List all fulfillments for your workspace. You will find detailed information about fulfilling orders is in [our Fulfillments guide](https://developers.myclickfunnels.com/docs/fulfillments). - [Create Fulfillment](https://developers.myclickfunnels.com/reference/createfulfillments.md): Fulfill an order or a part of an order. More information in [our Fulfillments guide](https://developers.myclickfunnels.com/docs/fulfillments). - [Fetch Fulfillment](https://developers.myclickfunnels.com/reference/getfulfillments.md): Retrieve a specific fulfillment in the current workspace - [Update Fulfillment](https://developers.myclickfunnels.com/reference/updatefulfillments.md): Update a specific fulfillment. - [Remove Fulfillment](https://developers.myclickfunnels.com/reference/removefulfillments.md): Remove Fulfillment - [Cancel a Fulfillment](https://developers.myclickfunnels.com/reference/cancelfulfillments.md): This will cancel a Fulfillment. A Fulfillment can only be cancelled when it's in a "fulfilled" state. The "cancelled" state is final. - [List Locations](https://developers.myclickfunnels.com/reference/listfulfillmentslocations.md): List Locations - [Create Location](https://developers.myclickfunnels.com/reference/createfulfillmentslocations.md): Create Location - [Fetch Location](https://developers.myclickfunnels.com/reference/getfulfillmentslocations.md): Fetch Location - [Update Location](https://developers.myclickfunnels.com/reference/updatefulfillmentslocations.md): Update Location - [Remove Location](https://developers.myclickfunnels.com/reference/removefulfillmentslocations.md): Remove Location - [List Orders](https://developers.myclickfunnels.com/reference/listorders.md): List all orders for the current workspace. Please refer to [our Orders Overview guide](https://developers.myclickfunnels.com/docs/orders) for more information about the different types of orders and payment processors. To apply an order filter that already exists in ClickFunnels, pass `stored_filter_id` or `stable_id`, see [Applying existing order filters](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#applying-existing-order-filters) in the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md). - [Create External Order](https://developers.myclickfunnels.com/reference/createorders.md): Create a new [external order](https://developers.myclickfunnels.com/docs/orders#external-orders) in the current workspace. This is useful if you process payments outside of ClickFunnels, but still want to make use of ClickFunnels' automations and funnels. You can gain even more functionality by creating invoices for your new orders. It is currently only possible to create invoices with the 'external' payment processor type. Other payment processors like 'payments_ai' are not yet supported. Refer to the corresponding guide for more information [here](https://developers.myclickfunnels.com/docs/orders#external-orders). - [Fetch Order](https://developers.myclickfunnels.com/reference/getorders.md): Retrieve a specific order in the current workspace. Please refer to [our Orders Overview guide](https://developers.myclickfunnels.com/docs/orders) for more information about the different types of orders and payment processors. - [Update Order](https://developers.myclickfunnels.com/reference/updateorders.md): Update a specific order in the current workspace. [External orders](https://developers.myclickfunnels.com/docs/orders#external-orders) have different updateable fields than orders that have a regular payment processor like Payments AI or Stripe. To stop a subscription from renewing, use `POST /orders/{id}/cancel` (see [Cancel a subscription](https://accounts.myclickfunnels.com/.well-known/orders/skill.md#cancel-a-subscription) in the [Orders Skill](https://accounts.myclickfunnels.com/.well-known/orders/skill.md)). - [Cancel Order](https://developers.myclickfunnels.com/reference/cancelorder.md): Cancel a subscription order through ClickFunnels' own cancel path (the same path the in-app "Cancel subscription" flow uses) so the cancelation actually propagates to the payment processor (Payments AI/Rebilly or Stripe). A direct `PATCH /orders/{id}` write of `service_status: canceled` is a no-op for processor-managed orders, which is why this action exists. Only Payments AI and Stripe subscription orders can be canceled. Calling this on a one-time order or an external subscription returns a 422. Please refer to [our Orders Overview guide](https://developers.myclickfunnels.com/docs/orders) for more information about the different types of orders and payment processors. See [Cancel a subscription](https://accounts.myclickfunnels.com/.well-known/orders/skill.md#cancel-a-subscription) in the [Orders Skill](https://accounts.myclickfunnels.com/.well-known/orders/skill.md) for the request body, the accepted `cancel_reason` values per processor, and a [worked example](https://accounts.myclickfunnels.com/.well-known/orders/skill.md#worked-example---cancel-then-confirm) that confirms the scheduled churn. - [List Applied Tags](https://developers.myclickfunnels.com/reference/listordersappliedtags.md): List the applied tags for an order - [Create Applied Tag](https://developers.myclickfunnels.com/reference/createordersappliedtags.md): Assign a tag to an order by creating an applied tag - [Fetch Applied Tag](https://developers.myclickfunnels.com/reference/getordersappliedtags.md): Retrieve an applied tag for an order - [Remove Applied Tag](https://developers.myclickfunnels.com/reference/removeordersappliedtags.md): Remove a tag from an order by deleting an applied tag - [List Invoices](https://developers.myclickfunnels.com/reference/listordersinvoices.md): List invoices for a specific order. Please refer to [our Orders Overview guide](https://developers.myclickfunnels.com/docs/orders/invoices) for more information about the different types of invoices and payment processors. - [Create External Invoice](https://developers.myclickfunnels.com/reference/createordersinvoices.md): Create an invoice for an external order. This is useful if you process payments outside of ClickFunnels, but still want to make use of ClickFunnels' automations and funnels. Refer to the corresponding guide for more information [here](https://developers.myclickfunnels.com/docs/orders#external-orders). - [Fetch Invoice](https://developers.myclickfunnels.com/reference/getordersinvoices.md): Retrieve an invoice for an order. Please refer to [our Orders Overview guide](https://developers.myclickfunnels.com/docs/orders/invoices) for more information about the different types of invoices and payment processors. - [Update External Invoice](https://developers.myclickfunnels.com/reference/updateordersinvoices.md): Update a specific invoice in the current workspace. Currently, only invoices of [external orders](https://developers.myclickfunnels.com/docs/orders#external-orders) can be updated. So, you can't update invoices of other payment processors, like Payments AI and Stripe. - [List Workspace Invoices](https://developers.myclickfunnels.com/reference/listworkspaceordersinvoices.md): List all invoices for a specific workspace. Please refer to the [API documentation](https://developers.myclickfunnels.com/docs/orders/invoices) for more information about the different types of invoices and payment processors. - [Abandon Invoice](https://developers.myclickfunnels.com/reference/abandonordersinvoices.md): Abandon an unpaid, draft, or past-due invoice through ClickFunnels' own abandon path (the same path the in-app "Abandon invoice" button uses) so the abandon propagates to the payment processor and STOPS its autopay retry (dunning) schedule for this invoice. Reach for this when the retries themselves are the problem: an insufficient-funds decline where the right move is to hold the retry cycle for a few days rather than cancel the subscription or refund the customer. Abandoning affects only this invoice - the order and its future rebills are untouched. A direct `PUT /orders/invoices/{id}` write of `status: abandoned` is not an alternative: that action is available only for external (self-managed) orders and returns 404 for processor-managed ones, because an invoice's `status` is a mirror ClickFunnels updates only after the processor confirms the change. Only invoices in `unpaid`, `draft`, or `past_due` status can be abandoned. An invoice in any other status returns 404 rather than 422, because this API hides records the caller may not act on. Please refer to [our Invoices guide](https://developers.myclickfunnels.com/docs/orders/invoices) for more information about the different types of invoices and payment processors. - [List Restocks](https://developers.myclickfunnels.com/reference/listrestocks.md): List Restocks - [Fetch Restock](https://developers.myclickfunnels.com/reference/getrestock.md): Fetch Restock - [Preview Variant/Price Change](https://developers.myclickfunnels.com/reference/previeworderslineitemschange.md): Returns a non-destructive preview of changing the variant and price of a subscription line item, including proration math, the next charge amount, and the effective date. Follows the same upgrade/downgrade rules as the in-app self-serve flow. When accessing the API through an OAuth connection from a third-party platform acting on another team's workspaces, this endpoint requires trusted platform access and returns 403 without it. This trusted-access check does not apply when acting on your own account (your own API key, or an OAuth app within its own team). Option discovery via change_options is a read and is never gated. Source allowed `products_price_id` targets from `GET /products/prices/{price_id}/change_options`. After previewing, call `POST /orders/line_items/{line_item_id}/changes/perform` with the same body to commit. The response envelope is identical between preview and commit and only the `preview` flag flips. On commit, the `previous_line_item` block reflects the line item's pre-change state for `products_price`, `products_variant`, `original_product`, and `prorated`. Other scalar attributes (`created_at`, `updated_at`, `quantity`) reflect the post-commit state on the underlying record. See [Step 2 - Preview the change](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md#step-2---preview-the-change) in the [Subscription Changes Skill](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md), and [Step 1 - Discover what's allowed](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md#step-1---discover-whats-allowed) for sourcing a legal target. - [Change Variant/Price](https://developers.myclickfunnels.com/reference/performorderslineitemschange.md): Commits a variant/price change for a subscription line item. The change must be configured as an allowed upgrade or downgrade option on the source variant. By default, upgrades take effect immediately and are prorated; downgrades take effect at the next renewal and are not prorated. Both behaviours can be overridden via `prorate` and `effective_time`. When accessing the API through an OAuth connection from a third-party platform acting on another team's workspaces, this endpoint requires trusted platform access and returns 403 without it. This trusted-access check does not apply when acting on your own account (your own API key, or an OAuth app within its own team). Source allowed `products_price_id` targets from `GET /products/prices/{price_id}/change_options`, and preview the impact via `POST /orders/line_items/{line_item_id}/changes` before committing here. The response envelope is the same as preview, with `preview: false` — the amount fields and `next_invoice_date` carry the upstream invoice quote snapshotted just before the commit was applied. The `previous_line_item` block reflects the line item's pre-change state for `products_price`, `products_variant`, `original_product`, and `prorated`. Other scalar attributes (`created_at`, `updated_at`, `quantity`) reflect the post-commit state on the underlying record. See [Step 3 - Commit the change](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md#step-3---commit-the-change) in the [Subscription Changes Skill](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md), plus [Eligibility](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md#eligibility) for which orders can be changed this way. - [List Transactions](https://developers.myclickfunnels.com/reference/listorderstransactions.md): List transactions for an order - [Fetch Transaction](https://developers.myclickfunnels.com/reference/getorderstransactions.md): Retrieve a transaction for an order - [Refund Transaction](https://developers.myclickfunnels.com/reference/refundorderstransactions.md): Refund this charge, in full, through ClickFunnels' own refund path (the same path the in-app refund button uses) so the money actually moves back through the payment processor (Payments AI/Rebilly or Stripe). A refund addresses a transaction because the transaction IS the charge: refundable balance and refund eligibility are tracked per transaction, and the refund is recorded against this one. A subscription order accumulates one charge per renewal and an invoice can carry more than one, so neither identifies a single charge to reverse. List an order's charges with `GET /orders/{order_id}/transactions` and refund the one you mean - a refundable charge has `external_type` `sale` or `capture`, `result: approved`, and `status` `completed` or `partially-refunded`. Partial refunds are deliberately not offered here, so this always refunds the charge's full outstanding amount. Writing `status: refunded` onto an invoice is not an alternative: that is available only for external (self-managed) orders, and a local status write moves no money. Payments AI/Rebilly records the refund synchronously, so the returned transaction already reflects it (200). Stripe only initiates the refund and confirms it in a later webhook, so the response is 202 and the returned transaction can still show its pre-refund `status`; poll `GET /orders/transactions/{id}` for the settled state. Please refer to [our Orders Overview guide](https://developers.myclickfunnels.com/docs/orders) for more information about the different types of orders and payment processors. - [List Tags](https://developers.myclickfunnels.com/reference/listorderstags.md): List all order tags for your workspace - [Create Tag](https://developers.myclickfunnels.com/reference/createorderstags.md): Add a new order tag to your workspace - [Fetch Tag](https://developers.myclickfunnels.com/reference/getorderstags.md): Retrieve a single order tag - [Update Tag](https://developers.myclickfunnels.com/reference/updateorderstags.md): Update an order tag - [Remove Tag](https://developers.myclickfunnels.com/reference/removeorderstags.md): Delete an order tag from your workspace - [List Pages](https://developers.myclickfunnels.com/reference/listpages.md): Page offers extra information about ClickFunnels pages, like those that are part of funnels. - [Create Page](https://developers.myclickfunnels.com/reference/createpage.md): 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`. - [Create External Page](https://developers.myclickfunnels.com/reference/createexternalpage.md): > **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 `` to your page's ``. 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). - [Fetch Page](https://developers.myclickfunnels.com/reference/getpages.md): Page offers extra information about ClickFunnels pages, like those that are part of funnels. - [Update Page](https://developers.myclickfunnels.com/reference/updatepages.md): 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). - [Delete Page](https://developers.myclickfunnels.com/reference/deletepage.md): Delete a page by ID. Works for both internal and external (SDK) pages. The page's show page steps are destroyed first (removing the funnel step slot entirely), then the page itself (including its SDK registration for external pages). - [Remove Products from Page](https://developers.myclickfunnels.com/reference/removeproductsfrompage.md): Detach one or more products from the page's show page step. This is the **only** way to remove products from a page via the API — the `show_page_step.product_ids` and `show_page_step.bumps` fields on `POST/PATCH /api/v2/pages` are additive-only and never remove products. Detaching is by product id and ignores the bump flag: main products and order bumps are removed the same way. Detach-then-re-attach via `show_page_step.product_ids` is also how you turn an order bump back into a main product. Accepts `product_ids: [...]` in the request body or query string. The batch is transactional — if any id does not resolve to a workspace product, or any id is not currently attached to the step, no products are detached. Returns 204 with no body on success. See [Manage products on a checkout page](https://accounts.myclickfunnels.com/.well-known/pages/skill.md#manage-products-on-a-checkout-page) in the [Pages Skill](https://accounts.myclickfunnels.com/.well-known/pages/skill.md) for the attach and detach lifecycle. - [Fetch Page Stats](https://developers.myclickfunnels.com/reference/getpagestats.md): Retrieve statistics for a page, including views, opt-ins, sales, and earnings. Stats are computed from the page's associated funnel step. `funnel` and `step` are `null` when the page is not part of a funnel (e.g. a standalone page or site page). This endpoint currently only reports analytics for pages reached via a funnel step; page-level analytics for standalone pages will be exposed in a future release. Defaults to a 30-day timerange ending now. Override with `timerange_start` and `timerange_end`. Timerange values are automatically clamped: future end dates are clamped to now, windows exceeding 90 days are clamped to 90 days, and if start is after end the window resets to 30 days ending at `timerange_end`. The metric names in the response are defined in [Metric vocabulary](https://accounts.myclickfunnels.com/.well-known/stats/skill.md#metric-vocabulary) in the [Stats Skill](https://accounts.myclickfunnels.com/.well-known/stats/skill.md). - [List Products](https://developers.myclickfunnels.com/reference/listproducts.md): List all products for a workspace - [Create Product](https://developers.myclickfunnels.com/reference/createproducts.md): Add a new product to a workspace - [Fetch Product](https://developers.myclickfunnels.com/reference/getproducts.md): Retrieve a product for a workspace - [Update Product](https://developers.myclickfunnels.com/reference/updateproducts.md): Update a product for a workspace - [Archive a Product](https://developers.myclickfunnels.com/reference/archiveproducts.md): This will archive a Product. A product can only be archived if it's not in the "live" state. - [Unarchive a Product](https://developers.myclickfunnels.com/reference/unarchiveproducts.md): This will unarchive a Product. - [List Collections](https://developers.myclickfunnels.com/reference/listproductscollections.md): List Collections - [Create Collection](https://developers.myclickfunnels.com/reference/createproductscollections.md): Create Collection - [Fetch Collection](https://developers.myclickfunnels.com/reference/getproductscollections.md): Fetch Collection - [Update Collection](https://developers.myclickfunnels.com/reference/updateproductscollections.md): Update Collection - [List Prices](https://developers.myclickfunnels.com/reference/listproductsprices.md): List all prices for a given product. This will include all prices for all variants of the product. You can also filter by variant_id to get prices for a specific variant. - [Fetch Price](https://developers.myclickfunnels.com/reference/getproductsprices.md): Retrieve a single price - [Update Price](https://developers.myclickfunnels.com/reference/updateproductsprices.md): Update a single price - [Create Price](https://developers.myclickfunnels.com/reference/createproductsprices.md): Create a new price for a given variant. Note that you must set a `variant_id` in the path. - [List Upgrade/Downgrade Options](https://developers.myclickfunnels.com/reference/listproductspriceschangeoptions.md): Returns the allowed upgrade and downgrade target variants for a price, grouped by target variant. Each group lists the prices on the target variant that a subscription using this source price may switch to. Use this to render dynamic upgrade pricing pages, or to source target `products_price_id` values for the line item change endpoints: `POST /orders/line_items/{line_item_id}/changes` (preview) and `POST /orders/line_items/{line_item_id}/changes/perform` (commit). See [Step 1 - Discover what's allowed](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md#step-1---discover-whats-allowed) in the [Subscription Changes Skill](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md) for the response shape and how to treat an empty result. - [List Variants](https://developers.myclickfunnels.com/reference/listproductsvariants.md): List variants for a product - [Create Variant](https://developers.myclickfunnels.com/reference/createproductsvariants.md): Create a new variant for a product - [Fetch Variant](https://developers.myclickfunnels.com/reference/getproductsvariants.md): Retrieve a single variant - [Update Variant](https://developers.myclickfunnels.com/reference/updateproductsvariants.md): Update a single variant - [List Tags](https://developers.myclickfunnels.com/reference/listproductstags.md): List tags for a product - [Create Tag](https://developers.myclickfunnels.com/reference/createproductstags.md): Add a new tag to a product - [Fetch Tag](https://developers.myclickfunnels.com/reference/getproductstags.md): Retrieve a tag for a product - [Update Tag](https://developers.myclickfunnels.com/reference/updateproductstags.md): Update a tag for a product - [Remove Tag](https://developers.myclickfunnels.com/reference/removeproductstags.md): Delete a tag for a product - [List Refine Filters](https://developers.myclickfunnels.com/reference/listworkspacerefinefilters.md): List saved filters in a workspace, ordered by id ascending. `after` is the switch between two modes. For backwards compatibility, omitting it returns the complete registry in one payload with no `Pagination-Next` header. Sending it returns bounded pages. For that bounded walk, pass `after=0` on the first request, then pass each `Pagination-Next` value on the next request until the header is absent, which marks the last page. `after=0` is the opt-in itself rather than a row id (real ids start at 1), and it means "start at the beginning" in whichever direction `sort_order` asks for, so it also bootstraps a `sort_order=desc` walk. An `after` value that is neither `0` nor a `Pagination-Next` cursor is not a real position and pages nothing. Results can include every filter class saved in the workspace, not only the ones this API authors; inspect `filter_class` before using the `id` or `public_id` as a resource's `stored_filter_id`. Treat returned order filters as read-only here and edit them in the ClickFunnels Orders UI. Create and update operations on this public endpoint author contact filters only. See [Applying existing order filters](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#applying-existing-order-filters) in the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md) for passing an order filter to the orders list. - [Create Refine Filter](https://developers.myclickfunnels.com/reference/createworkspacerefinefilter.md): Create a new contact RefineFilter in the workspace. This endpoint does not create order filters. The `criteria` array must contain at least one entry. Criteria are validated against the [safe-condition whitelist](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#safe-condition-whitelist) — unsupported attributes/clauses return 422 with a pointer to the dev community. See the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md) for the full reference (attributes, clauses, worked examples). - [Fetch Refine Filter](https://developers.myclickfunnels.com/reference/getrefinefilter.md): Fetch a single saved filter by its public id. Inspect `filter_class` before applying it to contacts or orders. Treat order filters as read-only here and edit them in the ClickFunnels Orders UI; create and update operations on this public endpoint author contact filters only. - [Update Refine Filter](https://developers.myclickfunnels.com/reference/updaterefinefilter.md): Update an existing RefineFilter. All fields are optional — only provided fields are updated. When `criteria` is supplied it replaces the entire criteria set (must contain at least one entry). 422 covers shape errors and [safe-condition policy](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#safe-condition-whitelist) violations. - [Destroy Refine Filter](https://developers.myclickfunnels.com/reference/destroyrefinefilter.md): Delete a RefineFilter. Note that deleting a filter that is currently attached to a conditional split step or other surface will leave those surfaces without a filter (`condition.filter_id` will remain but the filter record will no longer exist). Detach the filter from all consumers before deleting. See [Applying filters to consumers](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#applying-filters-to-consumers) in the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md) for the surfaces that hold a filter id. - [List Pipelines](https://developers.myclickfunnels.com/reference/listsalespipelines.md): List Pipelines - [Create Pipeline](https://developers.myclickfunnels.com/reference/createsalespipelines.md): Create Pipeline - [Fetch Pipeline](https://developers.myclickfunnels.com/reference/getsalespipelines.md): Fetch Pipeline - [Update Pipeline](https://developers.myclickfunnels.com/reference/updatesalespipelines.md): Update Pipeline - [List Stages](https://developers.myclickfunnels.com/reference/listsalespipelinesstages.md): List Stages - [Create Stage](https://developers.myclickfunnels.com/reference/createsalespipelinesstages.md): Create Stage - [Fetch Stage](https://developers.myclickfunnels.com/reference/getsalespipelinesstages.md): Fetch Stage - [Update Stage](https://developers.myclickfunnels.com/reference/updatesalespipelinesstages.md): Update Stage - [Remove Stage](https://developers.myclickfunnels.com/reference/removesalespipelinesstages.md): Remove Stage - [List Opportunities](https://developers.myclickfunnels.com/reference/listsalesopportunities.md): List Opportunities - [Create Opportunity](https://developers.myclickfunnels.com/reference/createsalesopportunities.md): Create Opportunity - [Fetch Opportunity](https://developers.myclickfunnels.com/reference/getsalesopportunities.md): Fetch Opportunity - [Update Opportunity](https://developers.myclickfunnels.com/reference/updatesalesopportunities.md): Update Opportunity - [Remove Opportunity](https://developers.myclickfunnels.com/reference/removesalesopportunities.md): Remove Opportunity - [List Notes](https://developers.myclickfunnels.com/reference/listsalesopportunitiesnotes.md): List Notes - [Create Note](https://developers.myclickfunnels.com/reference/createsalesopportunitiesnotes.md): Create Note - [Fetch Note](https://developers.myclickfunnels.com/reference/getsalesopportunitiesnotes.md): Fetch Note - [Update Note](https://developers.myclickfunnels.com/reference/updatesalesopportunitiesnotes.md): Update Note - [Remove Note](https://developers.myclickfunnels.com/reference/removesalesopportunitiesnotes.md): Remove Note - [List Location Groups](https://developers.myclickfunnels.com/reference/listshippinglocationgroups.md): List location groups for a profile - [Fetch Location Group](https://developers.myclickfunnels.com/reference/getshippinglocationgroups.md): Retrieve a location group for a profile - [List Packages](https://developers.myclickfunnels.com/reference/listshippingpackages.md): List packages for a workspace - [Create Package](https://developers.myclickfunnels.com/reference/createshippingpackages.md): Add a new package to a workspace - [Fetch Package](https://developers.myclickfunnels.com/reference/getshippingpackages.md): Retrieve a package for a workspace - [Update Package](https://developers.myclickfunnels.com/reference/updateshippingpackages.md): Update a package for a workspace - [Remove Package](https://developers.myclickfunnels.com/reference/removeshippingpackages.md): Delete a package for a workspace - [List Profiles](https://developers.myclickfunnels.com/reference/listshippingprofiles.md): List shipping profiles for a workspace - [Create Profile](https://developers.myclickfunnels.com/reference/createshippingprofiles.md): Add a new shipping profile to a workspace - [Fetch Profile](https://developers.myclickfunnels.com/reference/getshippingprofiles.md): Retrieve a shipping profile for a workspace - [Update Profile](https://developers.myclickfunnels.com/reference/updateshippingprofiles.md): Update a shipping profile for a workspace - [Remove Profile](https://developers.myclickfunnels.com/reference/removeshippingprofiles.md): Delete a shipping profile for a workspace - [List Rates](https://developers.myclickfunnels.com/reference/listshippingrates.md): List shipping rates for a zone - [Create Rate](https://developers.myclickfunnels.com/reference/createshippingrates.md): Add a new shipping rate to a zone - [Fetch Rate](https://developers.myclickfunnels.com/reference/getshippingrates.md): Retrieve a shipping rate for a zone - [Update Rate](https://developers.myclickfunnels.com/reference/updateshippingrates.md): Update a shipping rate for a zone - [Remove Rate](https://developers.myclickfunnels.com/reference/removeshippingrates.md): Delete a shipping rate for a zone - [List Zones](https://developers.myclickfunnels.com/reference/listshippingzones.md): List zones for a location group - [Create Zone](https://developers.myclickfunnels.com/reference/createshippingzones.md): Add a new zone to a location group - [Fetch Zone](https://developers.myclickfunnels.com/reference/getshippingzones.md): Retrieve a zone for a location group - [Update Zone](https://developers.myclickfunnels.com/reference/updateshippingzones.md): Update a zone for a location group - [Remove Zone](https://developers.myclickfunnels.com/reference/removeshippingzones.md): Delete a zone for a location group - [List Names](https://developers.myclickfunnels.com/reference/listshippingratesnames.md): List rate names for a shipping profile - [Create Name](https://developers.myclickfunnels.com/reference/createshippingratesnames.md): Add a new rate name to a shipping profile - [Fetch Name](https://developers.myclickfunnels.com/reference/getshippingratesnames.md): Retrieve a rate name for a shipping profile - [Update Name](https://developers.myclickfunnels.com/reference/updateshippingratesnames.md): Update a rate name for a shipping profile - [Remove Name](https://developers.myclickfunnels.com/reference/removeshippingratesnames.md): Delete a rate name for a shipping profile - [List Stores](https://developers.myclickfunnels.com/reference/liststores.md): List Stores - [Create Store](https://developers.myclickfunnels.com/reference/createstores.md): Create Store - [Fetch Store](https://developers.myclickfunnels.com/reference/getstores.md): Fetch Store - [Update Store](https://developers.myclickfunnels.com/reference/updatestores.md): Update Store - [Remove Store](https://developers.myclickfunnels.com/reference/removestores.md): Remove Store - [List Styles](https://developers.myclickfunnels.com/reference/liststyles.md): List Styles - [List Themes](https://developers.myclickfunnels.com/reference/listthemes.md): List of all themes available in the workspace - [Fetch Theme](https://developers.myclickfunnels.com/reference/getthemes.md): Retrieve a theme - [Update Theme](https://developers.myclickfunnels.com/reference/updatethemes.md): Update a theme - [Set Default Theme](https://developers.myclickfunnels.com/reference/set_defaultthemes.md): This will set the specified theme as the default theme for the current workspace. - [List Endpoints](https://developers.myclickfunnels.com/reference/listwebhooksoutgoingendpoints.md): List webhook endpoints for a workspace - [Create Endpoint](https://developers.myclickfunnels.com/reference/createwebhooksoutgoingendpoints.md): Add a new webhook endpoint to a workspace - [Fetch Endpoint](https://developers.myclickfunnels.com/reference/getwebhooksoutgoingendpoints.md): Retrieve a webhook endpoint for a workspace - [Update Endpoint](https://developers.myclickfunnels.com/reference/updatewebhooksoutgoingendpoints.md): Update a webhook endpoint for a workspace - [Remove Endpoint](https://developers.myclickfunnels.com/reference/removewebhooksoutgoingendpoints.md): Delete a webhook endpoint for a workspace - [List Events](https://developers.myclickfunnels.com/reference/listwebhooksoutgoingevents.md): List webhook events for a workspace - [Fetch Event](https://developers.myclickfunnels.com/reference/getwebhooksoutgoingevents.md): Retrieve an webhook event for a workspace - [List Event Types](https://developers.myclickfunnels.com/reference/listwebhooksoutgoingeventtypes.md): Returns the complete, authoritative catalog of webhook event types that a webhook endpoint can subscribe to. Each entry's `id` field is the exact dotted/slashed string key (e.g. `contact.updated`, `order.completed`, `orders/invoice.paid`) to supply verbatim in the `event_type_ids` array when creating or updating a webhook endpoint. Fetch this list instead of guessing event type identifiers or consulting an external reference — this is the canonical source. This endpoint is global (not scoped to a workspace) and requires a valid API token. - [List Workflows](https://developers.myclickfunnels.com/reference/listworkflows.md): List the standalone automation workflows for a workspace. Supports cursor pagination and sort. - [Create Workflow](https://developers.myclickfunnels.com/reference/createworkflow.md): Create a new standalone automation workflow. New workflows are created in the `draft` state (disabled). Add triggers and steps, then call `POST /workflows/{id}/enable` to make it live. - [Fetch Workflow](https://developers.myclickfunnels.com/reference/getworkflow.md): Retrieve a single workflow by its integer id or obfuscated public_id. - [Update Workflow](https://developers.myclickfunnels.com/reference/updateworkflow.md): Update a workflow's `name` or `archived` flag. `run_type` is server-controlled and cannot be changed. - [Delete Workflow](https://developers.myclickfunnels.com/reference/deleteworkflow.md): Permanently delete a workflow and all its associated triggers, steps, and run records. - [Fetch Workflow Structure](https://developers.myclickfunnels.com/reference/getworkflowstructure.md): Returns the workflow's complete tree in a single call: the workflow header, its active triggers (summary shape), and the ordered list of visible steps with branching inlined. Internal container nodes are spliced out. Split steps carry their child branches or variants directly in the response: - `conditional_split_step`: `branches` — always `[{branch: "matched", steps: [...]}, {branch: "unmatched", steps: [...]}]` - `split_test_step`: `variants` — each entry has `weight` and `steps`. Walk the `steps` array in order to follow execution flow. `sort_order` is container-local and is not globally unique across the tree. - [Enable Workflow](https://developers.myclickfunnels.com/reference/enableworkflow.md): Enable a workflow so it can accept new runs. The workflow must have at least one active trigger — otherwise returns 422. Returns the updated workflow. - [Disable Workflow](https://developers.myclickfunnels.com/reference/disableworkflow.md): Disable a workflow, stopping new runs from being started. In-progress runs are canceled. Returns the updated workflow. - [List Triggers](https://developers.myclickfunnels.com/reference/listworkflowtriggers.md): List all triggers attached to a workflow. - [Create Trigger](https://developers.myclickfunnels.com/reference/createworkflowtrigger.md): Add a new trigger to a workflow. The `event_type_key` must be a valid workflow trigger event key — an invalid value returns 422. All condition FK fields accept the integer id or obfuscated `public_id` of a referenced resource in the same workspace/team scope. - [Fetch Trigger](https://developers.myclickfunnels.com/reference/getworkflowtrigger.md): Retrieve a single workflow trigger. - [Update Trigger](https://developers.myclickfunnels.com/reference/updateworkflowtrigger.md): Update an existing workflow trigger. All fields optional. An invalid `event_type_key` returns 422. - [Delete Trigger](https://developers.myclickfunnels.com/reference/deleteworkflowtrigger.md): Delete a trigger from a workflow. - [List Steps](https://developers.myclickfunnels.com/reference/listworkflowsteps.md): List all visible (displayable) steps for a workflow using standard collection sorting. Internal container nodes are not included. `sort_order` is container-local and not globally unique; use `GET /workflows/{id}/structure` when clients need execution order. - [Create Step](https://developers.myclickfunnels.com/reference/createworkflowstep.md): Add a new step to a workflow. `step_type_settings` must contain exactly one key naming the step type. **Placement:** omit `parent_step_id` to append to the trunk sequence. Set `parent_step_id` + `branch` to place inside a split branch. Use `position` (0-based) or `after_step_id` to control order within a container. For `split_test_step`: provide `variants` with exactly 2 entries whose `weight` values sum to 100. For `conditional_split_step`: optionally provide `condition.filter_id` (integer id or obfuscated RefineFilter public_id). A `send_email_step` requires a complete business mailing address in the workspace's email settings. Configure it first with `PUT /workspaces/{workspace_id}/emails/settings`; an incomplete address returns 422. - [Fetch Step](https://developers.myclickfunnels.com/reference/getworkflowstep.md): Retrieve a single workflow step. - [Update Step](https://developers.myclickfunnels.com/reference/updateworkflowstep.md): Update a workflow step's `name`, `step_type_settings`, and/or placement. Moving split steps (`conditional_split_step`, `split_test_step`) is not supported and returns 422. A `send_email_step`'s `template_id` is create-only and cannot be changed here (returns 422) — edit the email in place with `html_body`/`text_body`, or create a new step to use a different template. - [Delete Step](https://developers.myclickfunnels.com/reference/deleteworkflowstep.md): Delete a step from a workflow. Split steps and their branch contents are removed recursively. - [List Runs](https://developers.myclickfunnels.com/reference/listworkflowruns.md): List automation runs for a workflow. Supports filtering by `contact_id` and `status`. Only standard automation runs are returned (survey runs excluded). - [Enroll Contact (Create Run)](https://developers.myclickfunnels.com/reference/createworkflowrun.md): Manually enroll a contact into a workflow, starting a new run immediately. The workflow must be enabled (`status: live`) — an unenabled workflow returns 422. The contact must belong to the same workspace. Some step types are skipped at enrollment rather than executed — notably page (`show_page_step`) and internal sequence/plumbing steps, which only make sense inside a funnel. This list is non-exhaustive; standalone automations run the action and split steps documented under Workflows::Step. - [Fetch Run](https://developers.myclickfunnels.com/reference/getworkflowrun.md): Retrieve a single workflow run by its id or obfuscated public_id. ## Changelog - [Manage discount codes through the API](https://developers.myclickfunnels.com/changelog/manage-discount-codes-through-the-api.md) - [Refund a specific transaction](https://developers.myclickfunnels.com/changelog/refund-a-specific-transaction.md) - [Create and manage email sender addresses](https://developers.myclickfunnels.com/changelog/create-and-manage-email-sender-addresses.md) - [Truncated page markup is rejected instead of saved](https://developers.myclickfunnels.com/changelog/truncated-page-markup-is-rejected-instead-of-saved.md) - [Set order bumps on a checkout page](https://developers.myclickfunnels.com/changelog/set-order-bumps-on-a-checkout-page.md) - [Provision email sending domains through the API](https://developers.myclickfunnels.com/changelog/provision-email-sending-domains-through-the-api.md) - [Stop payment retries on a past-due invoice](https://developers.myclickfunnels.com/changelog/stop-payment-retries-on-a-past-due-invoice.md) - [Variant create responses match what you read back](https://developers.myclickfunnels.com/changelog/variant-create-responses-match-what-you-read-back.md) - [Change a blog's appearance through the API](https://developers.myclickfunnels.com/changelog/change-a-blogs-appearance-through-the-api.md) - [Publishing a course or section now publishes its lessons](https://developers.myclickfunnels.com/changelog/publishing-a-course-or-section-now-publishes-its-lessons.md)