ClickFunnels API

The ClickFunnels 2.0 REST API — 418 operations across 230 paths and 102 resource tags, covering the whole platform: teams, users, workspaces, sites, funnels, pages, blogs, communities, courses, contacts and tags, forms, products, variants, prices, collections, discounts, orders, invoices, transactions, fulfillments, email templates/broadcasts/domains/addresses, workflows, stats and outgoing webhooks. Cursor pagination, bracketed filters, expand[] field expansion, and a mandatory User-Agent header.

OpenAPI Specification

clickfunnels-api-openapi.json Raw ↑
{"openapi":"3.1.0","info":{"title":"ClickFunnels API","termsOfService":"https://www.clickfunnels.com/terms-of-service","contact":{"name":"ClickFunnels API Team","url":"https://developers.myclickfunnels.com"},"x-logo":{"url":"https://statics.myclickfunnels.com/image/1126065/file/31edf05760fafe41a82f16a668ab251f.png"},"description":"The ClickFunnels REST API that powers webhooks, native integrations, and Zapier lets you manage your ClickFunnels data, automate your workflows, and recreate ClickFunnels functionality in your own apps.\n","license":{"name":"MIT","url":"https://opensource.org/licenses/MIT"},"version":"2.0.0"},"tags":[{"name":"Team","description":"Teams"},{"name":"User","description":"Users"},{"name":"Workspace","description":"Workspace"},{"name":"Site","description":"> Sites represent a workspace's website configuration containing global code settings.\n"},{"name":"Addresses::Country","description":"> Countries are a global reference list used when setting addresses.\n\nThe Addresses::Country API provides read-only access to the list of 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.\n"},{"name":"Addresses::Region","description":"> Regions are the states/provinces of a country.\n\nThe Addresses::Region API provides read-only access to the regions of a country. Use a region's code or name as the address region value. Many countries have no regions.\n"},{"name":"Appointments::ScheduledEvent","description":"> Scheduled Appointment Events represent set meeting events\n\nThe Appointment Scheduled Event represents a scheduled meeting between a ClickFunnels user and a contact on a specific day and time.\n"},{"name":"Blog","description":"> Blogs represent a blog resource belonging to a workspace site\n\nA Blog is a top-level container for blog posts, categories, tags, and authors. Each workspace site can have one or more blogs, each with their own SEO settings, theme, and URL path.\n\nSee the [Blogs Skill](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md) for the end-to-end guide to creating, reading, and updating blog posts.\n"},{"name":"Blogs::Author","description":"Blog Authors. See [Authors (read-only)](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md#authors-read-only) in the [Blogs Skill](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md)."},{"name":"Blogs::Category","description":"Blog Categories. See [Categories (read-only)](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md#categories-read-only) in the [Blogs Skill](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md)."},{"name":"Blogs::Post","description":"> Blog Posts are the individual articles published within a Blog\n\nBlog posts support rich content via PML markup, visibility controls, SEO settings, categories, tags, and authors. Use `expand[]=markup` to retrieve the PML markup for a post's visual content.\n\nSee [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); the `markup` body is authored in PML — see the [Page Markup Skill](https://accounts.myclickfunnels.com/.well-known/page-markup/skill.md).\n\nTo copy posts in from an external RSS/Atom feed or article page, see the [Import External Blog Post Skill](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md), which covers [normalizing external HTML for PML](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#3-normalize-external-html-for-pml), [duplicate checking](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#4-discover-the-destination-and-check-for-duplicates), and [verifying the draft](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#6-verify-the-draft) before publishing.\n"},{"name":"Blogs::Tag","description":"Blog Tags. See [Tags (list / show / create)](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md#tags-list--show--create) in the [Blogs Skill](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md)."},{"name":"Community","description":"> Communities are membership-based spaces where contacts can post, interact, and engage.\n\nA Community is the top-level container for community content. It belongs to a workspace site and holds one or more Space Groups, each of which contains Spaces (Topics). Use the `Communities::SpaceGroup` and `Communities::Space` resources to manage the groups and topics within a community.\n"},{"name":"Communities::SpaceGroup","description":"> Space Groups are named sections within a Community that contain Spaces (Topics).\n\nA Space Group is a logical grouping of Spaces (Topics) within a Community. Use Space Groups to organize community content into sections. Each Space Group can have its own access level, post/comment approval settings, and visibility controls.\n"},{"name":"Communities::Space","description":"> Spaces (Topics) are the individual discussion areas within a Space Group.\n\nA Space is a single discussion channel or topic area within a Space Group. Members post, comment, and interact inside Spaces. Each Space can be configured with its own layout, access controls, sorting, and SEO settings.\n"},{"name":"Communities::Spaces::Post","description":"> Posts are member-created content items within a Community Space.\n\nA Post belongs to a Space and is authored by a Contact. Posts support rich HTML body content, optional titles, pinning, and cover images. Posts created via the API are auto-approved. Use `Communities::Spaces::Post::Comment`, `Communities::Spaces::Post::Like`, and `Communities::Spaces::Post::VideoEmbed` to manage the sub-resources of a post.\n"},{"name":"Communities::Spaces::Post::Comment","description":"> Comments are member replies on a Community Post.\n\nA Comment belongs to a Post and is authored by a Contact. Comments support rich HTML body content and threaded replies via `parent_comment_id`. Comments created via the API are auto-approved.\n"},{"name":"Communities::Spaces::Post::Like","description":"> Post Likes record a Contact's like reaction on a Community Post.\n\nA Post Like belongs to a Post and is authored by a Contact. Likes have no update operation — create one to like, delete it to unlike.\n"},{"name":"Communities::Spaces::Post::Comment::Like","description":"> Comment Likes record a Contact's like reaction on a Post Comment.\n\nA Comment Like belongs to a Comment and is authored by a Contact. Likes have no update operation — create one to like, delete it to unlike.\n"},{"name":"Communities::Spaces::Post::VideoEmbed","description":"> Video Embeds attach a hosted video to a Community Post.\n\nA Video Embed belongs to a Post and stores the provider name, source URL, and optional provider-specific metadata. Video Embeds have no update operation.\n"},{"name":"Communities::Membership","description":"> Memberships represent a Contact's membership in a Community.\n\nA Membership joins a Contact to a Community and tracks whether that member has moderator privileges. Creating or updating a membership also syncs the member's Space memberships to exactly the list of `space_ids` supplied. Deleting a membership removes the contact from all Spaces in the community as well.\n\nSee also: `Communities::Memberships::BanAction`, `Communities::Memberships::AddToGroupAction`, `Communities::Memberships::RemoveFromGroupAction`, and `Communities::Memberships::ExportAction` for async bulk operations on memberships.\n"},{"name":"Communities::Ban","description":"> Bans prevent a Contact from accessing a Community.\n\nA Ban records which Contact is banned, who issued the ban, the scope of the ban (`bannable_type`/`bannable_id`), and an optional reason. The `banned_by` moderator is set automatically to the acting user — it cannot be set in the request body. Bans have no update operation — delete and recreate to change the reason.\n\nSee also: `Communities::Bans::UnbanAction` and `Communities::Bans::ExportAction` for async bulk operations on bans.\n"},{"name":"Communities::Memberships::BanAction","description":"> Async bulk action that bans multiple community members in the background.\n\nCreating a BanAction enqueues a background job and immediately returns an action record. Poll the `show` endpoint using the returned `id` and check the `status` field (`queued` → `processing` → `completed`) to track progress.\n"},{"name":"Communities::Memberships::AddToGroupAction","description":"> Async bulk action that adds multiple members to one or more community spaces (groups) in the background.\n\nCreating an AddToGroupAction enqueues a background job and immediately returns an action record. Poll the `show` endpoint using the returned `id` and check the `status` field (`queued` → `processing` → `completed`) to track progress.\n"},{"name":"Communities::Memberships::RemoveFromGroupAction","description":"> Async bulk action that removes multiple members from one or more community spaces (groups) in the background.\n\nCreating a RemoveFromGroupAction enqueues a background job and immediately returns an action record. Poll the `show` endpoint using the returned `id` and check the `status` field (`queued` → `processing` → `completed`) to track progress.\n"},{"name":"Communities::Memberships::ExportAction","description":"> Async bulk action that exports community membership data to a file in the background.\n\nCreating an ExportAction enqueues a background job and immediately returns an action record. Poll the `show` endpoint using the returned `id` and check the `status` field (`queued` → `processing` → `completed`) to track progress. Use the `index` endpoint to list previous export actions for a community.\n"},{"name":"Communities::Bans::UnbanAction","description":"> Async bulk action that unbans multiple contacts from a community in the background.\n\nCreating an UnbanAction enqueues a background job and immediately returns an action record. Poll the `show` endpoint using the returned `id` and check the `status` field (`queued` → `processing` → `completed`) to track progress.\n"},{"name":"Communities::Bans::ExportAction","description":"> Async bulk action that exports community ban data to a file in the background.\n\nCreating an ExportAction enqueues a background job and immediately returns an action record. Poll the `show` endpoint using the returned `id` and check the `status` field (`queued` → `processing` → `completed`) to track progress. Use the `index` endpoint to list previous export actions for a community.\n"},{"name":"Contact","description":"Contact"},{"name":"Contacts::AppliedTag","description":"> Contact Applied Tags\n\nThe Contact Applied Tags APIs allow you to list, apply and remove tags associated with a specific contact.\n\nTo utilize this, first obtain the Tag IDs for all the Contact Tags for your workspace via the Contacts::Tags API.\n\nYou can manage tags for any contact by creating or deleting the corresponding Applied Tags as needed.\n\nNote:\nThere is no 'update' method for this API since you should just remove and add a new tag to change them.\n"},{"name":"Contacts::Filter","description":"> AI-generated contact filters\n\nTranslate a natural-language audience description into a ClickFunnels contact filter using an AI model.\n\nThe model can use the full range of contact filter conditions — identity, tags, last activity, email\nengagement, opt-ins, product/variant purchases & ownership, custom attributes, and more — so describe the\naudience however you like (e.g. \"buyers of the $99 course who joined in the last 30 days\"). Unlike the\ncriteria you submit directly to the RefineFilter endpoints, this endpoint is not limited to the public-API\ncondition allow-list.\n\nThe endpoint always returns a `stable_id` token you can use as the `stable_id` query parameter on the\ncontacts index. Keep the token opaque and let the HTTP client encode the complete query parameter value;\nwith curl, use `-G --data-urlencode \"stable_id=$STABLE_ID\"`. Do not decode the token or interpolate it\ndirectly into a raw URL. When `save: true` is supplied the filter is also persisted as a reusable\n`Refine::StoredFilter` — identical to filters created via the RefineFilter endpoints — and its\n`id`/`public_id` are included in the response so you can reference it later with `stored_filter_id`.\n\nSee [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 the request body, the `save` semantics, and how the returned `stable_id` is applied to the contacts index.\n"},{"name":"Contacts::Tag","description":"# Contact Tags\n\nContact Tags are unique to each workspace, allowing for customized organization of your Contacts. Once created, these tags can be applied to any contact within the same workspace using the Contacts::AppliedTag endpoint.\n\nThis API allows you to manage the Contact Tags for your workspace.\n"},{"name":"Contacts::TagAction","description":"> Bulk apply or remove tags across a filtered set of contacts\n\nA Tag Action applies (or removes) one or more Contact Tags across an entire audience in a single async operation. Instead of looping over contacts one by one, submit a Tag Action with a target selection and let ClickFunnels process it in the background.\n\n**Target selection** — supply exactly one of:\n- `stable_id` — a URL-encoded Refine `stable_id` token (e.g. from `POST /api/v2/workspaces/{workspace_id}/contacts/filters`). Pass the token exactly as returned; do not decode or re-encode it. The server persists the decoded filter so the async job can re-derive the audience at perform time.\n- `stored_filter_id` — the `id` of a saved `Refine::StoredFilter` scoped to this workspace (must be a ContactsFilter). Also accepted as `filter_id`.\n- `target_ids` — an explicit array of contact public IDs.\n- `target_all` — `true` to target every contact in the workspace.\n\n**Progress tracking** — after creating a Tag Action, poll it with `GET /api/v2/contacts/tag_actions/{id}`. The response reflects async progress via `target_count` (total contacts to process) and `performed_count` (contacts processed so far).\n"},{"name":"Contacts::EnrollAction","description":"> Bulk-enroll contacts into course sections\n\nAn Enroll Action enrolls an entire audience of contacts into one or more course sections in a single async operation. Pass `course_ids` to enroll in every section of those courses, or `section_ids` for specific sections (or both).\n\n**Target selection** — supply exactly one of:\n- `stable_id` — a URL-encoded Refine `stable_id` token.\n- `stored_filter_id` — the `id` or `public_id` of a saved `Refine::StoredFilter` (ContactsFilter). Also accepted as `filter_id`.\n- `target_ids` — an explicit array of contact public IDs.\n- `target_all` — `true` to target every contact in the workspace.\n\n**Progress tracking** — after creating an Enroll Action, poll it with `GET /api/v2/contacts/enroll_actions/{id}`. The response reflects async progress via `target_count` and `performed_count`.\n\nSee [How a course is structured](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#how-a-course-is-structured) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md) for what the `course_ids` and `section_ids` you target refer to and how to list them.\n"},{"name":"Contacts::RunWorkflowAction","description":"> Bulk-trigger a workflow across a filtered set of contacts\n\nA Run Workflow Action enqueues an entire audience of contacts into a workflow in a single async operation. Requires a `workflow_id`. Set `force_run: true` to re-run contacts already in the workflow.\n\n**Target selection** — supply exactly one of:\n- `stable_id` — a URL-encoded Refine `stable_id` token.\n- `stored_filter_id` — the `id` or `public_id` of a saved `Refine::StoredFilter` (ContactsFilter). Also accepted as `filter_id`.\n- `target_ids` — an explicit array of contact public IDs.\n- `target_all` — `true` to target every contact in the workspace.\n\n**Progress tracking** — after creating a Run Workflow Action, poll it with `GET /api/v2/contacts/run_workflow_actions/{id}`.\n\nSee the [Workflows Skill](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md) for building the workflow this action enrolls contacts into, and [Enabling, disabling](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#enabling-disabling) for taking it live.\n"},{"name":"Contacts::UnsubscribeAction","description":"> Bulk-unsubscribe contacts from email\n\nAn Unsubscribe Action marks an entire audience of contacts as unsubscribed from email in a single async operation.\n\n**Target selection** — supply exactly one of:\n- `stable_id` — a URL-encoded Refine `stable_id` token.\n- `stored_filter_id` — the `id` or `public_id` of a saved `Refine::StoredFilter` (ContactsFilter). Also accepted as `filter_id`.\n- `target_ids` — an explicit array of contact public IDs.\n- `target_all` — `true` to target every contact in the workspace.\n\n**Progress tracking** — after creating an Unsubscribe Action, poll it with `GET /api/v2/contacts/unsubscribe_actions/{id}`.\n"},{"name":"Contacts::ExportAction","description":"> Bulk-export contacts to a CSV file\n\nAn Export Action generates a CSV of an audience of contacts in a single async operation. Supply `fields` to control which contact columns appear in the CSV (including custom attribute keys). Once complete, the `file_url` field on the record contains a download URL.\n\n**Target selection** — supply exactly one of:\n- `stable_id` — a URL-encoded Refine `stable_id` token.\n- `stored_filter_id` — the `id` or `public_id` of a saved `Refine::StoredFilter` (ContactsFilter). Also accepted as `filter_id`.\n- `target_ids` — an explicit array of contact public IDs.\n- `target_all` — `true` to target every contact in the workspace.\n\n**Progress tracking** — after creating an Export Action, poll it with `GET /api/v2/contacts/export_actions/{id}`. When complete, `file_url` contains the CSV download URL.\n"},{"name":"Course","description":"> Represents the volume of educational material\n\nThe course is the top-level layer of a concept for educational material. It is the _thing_  to be sold\nto a customer. Once a customer purchases or otherwise opts into a course, they will be enrolled into\nthe underlying sections and lessons.\n\nYou can get a broader understanding of the structure of a course by studying the `Courses::Section`\nand `Courses::Lesson` endpoints.\n\nSee the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md) for the end-to-end guide — [creating a course](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#creating-a-course) and building out its sections and lessons.\n"},{"name":"Courses::Enrollment","description":"> Controls access to course sections and lessons\n\nBy purchasing or otherwise opting into a course, an enrollment record is created. Enrollments\ndictate which sections, sub-sections, and lessons the student can access.\n\nProgress for an enrollment can be tracked for a Course, Section, and Lesson.\n\nTo grant course access from an automation instead of creating enrollments directly, see [Step catalog](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#step-catalog) in the [Workflows Skill](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md).\n"},{"name":"Courses::Section","description":"> Represents the modules within a Course\n\nThe section is the organization layer of a course where the content is accessed and managed for\na customer. Sections can have sub-sections and will have one or more lessons. Access to sections\ncan be managed by the `Courses::Enrollment` and also by the completion of previous sections and lessons.\n\nSee [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) for creating modules and the fields you can set.\n"},{"name":"Courses::Lesson","description":"> Represents the material within a Course\n\nThe lesson is the part of the course which teaches the material described within the course. Completing\nlessons can unlock access to other lessons or sections within a course. Completing lessons increases the\ncourse progress percent.\n\nSee [Lessons](https://accounts.myclickfunnels.com/.well-known/courses/skill.md#lessons) in the [Courses Skill](https://accounts.myclickfunnels.com/.well-known/courses/skill.md) for creating and updating lessons.\n"},{"name":"Courses::LessonCompletion","description":"> Marks a lesson as completed for enrollment.\n\nTo mark a lesson as completed by an enrollment, create an `Courses::LessonCompletion` record.\nTo undo this, the `Courses::LessonCompletion` record must be deleted.\n"},{"name":"Courses::Sections::PublishAction","description":"> Publishes course sections (and their lessons) in bulk.\n\nA Publish Action selects one or more course sections — either by explicit `target_ids` (course-section public IDs) or `target_all` — and publishes them along with their lessons. It can optionally grant existing course enrollees access to the newly published sections (`auto_enroll`) and email them (`send_email`). The action runs asynchronously; poll the returned record for `target_count` / `performed_count` progress.\n\nUse `scheduled_for` to defer the publish to a future datetime.\n\nSee [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.\n"},{"name":"Discount","description":"> A reusable, workspace-scoped discount the checkout applies on top of a price.\n\nA Discount is the right tool for a coupon code, a percentage/amount off, or a\ntime-boxed sale - anything you would otherwise fake with a second \"sale\" price.\nIt is one reusable object applied on top of the price, so you can start, scope,\nand expire it without touching the product's prices.\n\nA `code`-type discount (the default) needs a unique `code` that buyers redeem at\ncheckout - letters, numbers and hyphens only. `discount_method` decides which amount\nfield is required: `percentage` needs `percent` (0.01-100); `fixed` needs a positive\n`amount`. `currency` defaults to the workspace currency and `apply_from` defaults to\nnow, so a discount is live immediately unless you schedule it with a future\n`apply_from` and/or expire it with `apply_until`.\n\nBy default a discount applies to `all_products`. Set `applies_to` to\n`specific_products` / `specific_variants` / `specific_collections` and pass the\nmatching `product_ids` / `variant_ids` / `products_collection_ids` array to scope it.\n\nTwo lock-out rules govern the end of a discount's life. Once it has been redeemed on\nan order its money-affecting fields are locked (422 on update) while renaming and\nexpiring still work. Once it has actually expired it is frozen completely - every\nupdate returns 422 - so rename before you expire, not after. A discount attached to\nan order cannot be deleted at all; `redemptions_count` does not predict that, since\nit only counts completed sales.\n"},{"name":"Domain","description":"> Domains represent custom domains connected to a workspace.\n\nThe Domains API provides read-only access to the domains configured for a workspace. Use this API to look up domain IDs for use with other resources such as Funnels.\n"},{"name":"Download","description":"> Downloads are workspace files that can be granted through product variants.\n\nUse the Download's `asset_id` when configuring digital-asset access through the `Products::Variant` resource.\n"},{"name":"Emails::Address","description":"> Email Addresses\n\nEmail Addresses represent sender addresses in your workspace. These are used as \"from\" and \"reply-to\" addresses when sending email broadcasts. Select a from-address whose `usable_as_sender` field is true; for a custom domain that means its sending domain is verified and connected to this workspace, while a shared workspace-default address is available only as the fallback.\n\nSee [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).\n"},{"name":"Emails::Broadcast","description":"> Email Broadcasts\n\nEmail Broadcasts allow you to send one-time email campaigns to your contacts. Broadcasts are created in draft status and can be sent immediately or scheduled for later delivery.\n\nTo target a broadcast's audience, set `filter_id` to a contact filter. You can pass the numeric id or the public id of a saved contact filter (a RefineFilter created via the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md)), or a serialized contact filter. The supplied filter is copied onto the broadcast, so editing or deleting the saved filter afterward never changes an existing broadcast's audience. See [Applying filters to email broadcasts](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#applying-filters-to-email-broadcasts) for the full flow.\n\nSee [Broadcasts](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#broadcasts) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md).\n"},{"name":"Emails::Broadcasts::SendAction","description":"> Send Actions trigger the actual delivery of an email broadcast.\n\nA Send Action is the trigger that sends (or schedules) the parent broadcast — the same action the ClickFunnels dashboard fires when you click \"Send\". Creating a Send Action will immediately dispatch the broadcast (or schedule it for a future date/time if `send_at` is provided).\n\nBefore a Send Action can be created, the broadcast must be ready to send: it requires a topic, a from-address whose `usable_as_sender` is `true`, and a complete workspace marketing address. If any of these are missing, the create returns 422 listing what is needed.\n\nThe send itself runs asynchronously. Poll the returned Send Action record and compare `performed_count` to `target_count` to track progress. `started_at` and `completed_at` reflect async job progress.\n\nSee [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).\n"},{"name":"Emails::Domain","description":"> Email Domains represent the sending domains (DKIM/SPF/DMARC) available to a workspace for outbound email.\n\nOne domain name has two independent jobs, and sending needs both. This resource covers email transport: `verified` means the name is authenticated for sending (DKIM + SPF + DMARC, or a verified SMTP setting). The other job is proving the workspace owns the name, reported here as `ownership_verified`; that happens by connecting the domain to the workspace as a website/hosting domain inside the ClickFunnels app (a website domain is connected as a subdomain such as `www.example.com`, which confirms ownership of the root sending domain `example.com`), and no call in this API can make it true. Neither substitutes for the other: `ready_for_sending` becomes true only when both are true, and a `200` from verify means the check ran, not that it passed, so always read the booleans back.\n\nProvision the root domain (`example.com`), not a subdomain: ownership is confirmed at the root domain, so a subdomain is rejected with `422` naming the root domain to use instead.\n\nTypical workflow: provision the sending domain (`POST /workspaces/{workspace_id}/emails/domains`), have the customer publish the returned DNS records and connect the same name to the workspace in ClickFunnels, then re-check with `POST /emails/domains/{id}/verify` until `ready_for_sending` is true, following `next_steps` for whatever is still missing. Then create sender addresses via `POST /workspaces/{workspace_id}/emails/addresses` with `emails_domain_id` set to this domain's numeric id.\n\nSee [Sending domains](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#sending-domains) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md).\n"},{"name":"Emails::Settings","description":"> Email Settings\n\nEmail Settings represent your workspace's email configuration, including default from and reply-to addresses for system and marketing emails.\n\nSee 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).\n"},{"name":"Emails::Template","description":"> Email Templates\n\nEmail Templates are reusable email content that can be used with broadcasts.\n\nSee [Templates](https://accounts.myclickfunnels.com/.well-known/emails/skill.md#templates) in the [Emails Skill](https://accounts.myclickfunnels.com/.well-known/emails/skill.md).\n"},{"name":"Emails::Topic","description":"> Email Topics\n\nEmail Topics are used for email broadcast categorization and subscriber preferences.\n\nSee [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).\n"},{"name":"Form","description":"> Manage Forms, FieldSets, Fields, Submissions and Answers\n\nThe Forms API and it's related resources allow you to manage in detail all parts of your ClickFunnels forms.\n"},{"name":"Forms::FieldSet","description":"Form FieldSets"},{"name":"Forms::Field","description":"Form Fields"},{"name":"Forms::Fields::Option","description":"Form Field Options"},{"name":"Forms::Submission","description":"> Allows to submit and analyze forms programmatically\n\nThe `Forms::Submission` resource together with the `Form` and other `Forms::` allows you to create\nform submission programmatically outside of ClickFunnels.\n\nTo get the raw submission data, refer to the `FormSubmission` resource.\n"},{"name":"Forms::Submissions::Answer","description":"Form Submission Answers"},{"name":"FormSubmission","description":"> Presents submitted forms including the detailed data breakdown\n\nThe `FormSubmission` resource is a log of all the form submissions that happened for a given workspace. You can retrieve the form submissions including their recorded standard and custom fields data.\n\nPlease refer to the `Form` and `Forms::Submission` resources if you would like to submit forms programmatically.\n"},{"name":"Funnel","description":"> The Funnel resource contains relevant metadata about funnels.\n\nFunnel-level analytics are available via the Fetch Funnel Stats endpoint (`GET /funnels/{funnel_id}/stats`); per-page analytics via the Fetch Page Stats endpoint (`GET /pages/{page_id}/stats`).\n\nSee the [Funnels Skill](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md) for building and modifying funnel workflows ([split tests](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#split-test-steps), [conditional splits](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#conditional-split-steps), [structure](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#funnel-structure)), and the [Stats Skill](https://accounts.myclickfunnels.com/.well-known/stats/skill.md) for reading funnel and page analytics.\n"},{"name":"Funnels::ConditionalSplitStep","description":"> Conditional split steps route contacts down a \"matched\" or \"unmatched\" branch based on a RefineFilter condition.\n\nConditional split steps live inside a funnel's workflow. Each step exposes a `condition` (filter + setup state) and a 2-entry `branches` array (`[matched, unmatched]`). See the [Funnels Skill](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#conditional-split-steps) for the full surface.\n"},{"name":"Funnels::SplitTestStep","description":"> Split test steps wrap an existing funnel page in a two-branch A/B split with confi

# --- truncated at 32 KB (1382 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/clickfunnels/refs/heads/main/openapi/clickfunnels-api-openapi.json