{"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 configurable traffic weights.\n\nSplit test steps live inside a funnel's workflow. Each step exposes a 2-entry `variants` array with `page_id` and `weight` per branch. See the [Funnels Skill](https://accounts.myclickfunnels.com/.well-known/funnels/skill.md#split-test-steps) for the full surface.\n"},{"name":"Funnels::Tag","description":"> Funnels::Tag are used to distinguish, segment and run additional automations on your funnels and the users who go through them.\n"},{"name":"Image","description":"> Images can be used in a variety of use cases.\n\nAn image can be created or updated from a URL by defining the `upload_source_url` parameter. The response returns\nthe hosted `url` and the Image `id`.\n\nFor a blog migration, create an Image for each source image, replace the source URL in the post body with the\nreturned hosted `url`, and use the Image `id` as the blog post's `image_id` only when it is the featured image.\nKeep a source-to-hosted URL map so repeated images are uploaded once. The same Image IDs can also be assigned to\nProducts with the `image_ids` parameter.\n\n> Limitations and Constraints\n\nImages have a file size limit of 10MB and a dimension size limit of 10,000 x 10,000 pixels. Image file types currently supported include:\n\n```shell\n# IMAGE TYPES\njpeg, png, webp, x-icon, vnd.microsoft.icon\n# TEXT TYPES\nsvg+xml, gif\n```\n\nOnce uploaded, an image will return the following files and sizes\n\n| File Description | Width | Height |\n|--------------------------------------------------|--------------------|------------------------------------------------------------------------|\n| Thumbnail | 80 | 52 |\n| Small | 300 | 300 |\n| Medium | 600 | 600 |\n| Large | 800 | 800 |\n| X-Large | 2000 | 2000 |\n|--------------------------------------------------|--------------------|------------------------------------------------------------------------|\n"},{"name":"Fulfillment","description":"> Fulfillments allow fulfilling orders and managing shipments.\n\nPlease refer to [our Fulfillments guide](https://developers.myclickfunnels.com/docs/fulfillments) for more information.\n"},{"name":"Fulfillments::Location","description":"Fulfillment Locations"},{"name":"Order","description":"> Orders describe a purchase made by a contact.\n\nPlease refer to the [Orders Overview Guide](https://developers.myclickfunnels.com/docs/orders) for more information.\n\nSee the [Orders Skill](https://accounts.myclickfunnels.com/.well-known/orders/skill.md) for driving an existing order's lifecycle, including how to [cancel a subscription](https://accounts.myclickfunnels.com/.well-known/orders/skill.md#cancel-a-subscription) so it stops renewing at the payment processor.\n"},{"name":"Orders::AppliedTag","description":"> Order Applied Tags\n\nThe Order Applied Tags APIs allow you to list, apply and remove tags associated with a specific order.\n\nTo utilize this, first obtain the Tag IDs for all the Order Tags for your workspace via the Orders::Tag API.\n\nYou can manage tags for any order by creating or deleting the corresponding Applied Tags as needed.\n\nNote:\nThere is no 'update' method for this resource since you should just remove or add a new tag to change them.\n"},{"name":"Orders::Invoice","description":"> Invoices track payments for orders.\n\nOrder Invoices are the invoices issued against Orders. For more information please consult our [Orders Overview guide](https://developers.myclickfunnels.com/docs/orders).\n\nOrders can be fulfilled by fulfilling invoice line items. Please refer to [our Fulfillments guide](https://developers.myclickfunnels.com/docs/fulfillments) to see how this can be done.\n"},{"name":"Orders::Invoices::Restock","description":"> Restocks make it possible to restock in case a priorly issued fulfillment is not going to be fulfilled.\n\nIf a customer pays for an invoice that will not get fulfilled (e.g. the invoice may have been refunded), a restock needs to be created so the committed inventory quantity can be returned to available inventory.\n\nA restock can also be cancelled, in which case the inventory quantity will be adjusted back.\n"},{"name":"Orders::LineItems::Change","description":"> Preview and commit variant/price changes on existing subscription line items.\n\nA self-serve flow for switching the variant or price on a subscription line item. The\nsurface has three endpoints — discovery (`Products::Prices::ChangeOption`) tells\nyou which targets are allowed; this resource is the actual change. `POST` to `…/changes`\nto preview the upcoming invoice (`preview: true`); `POST` to `…/changes/perform` to commit\n(`preview: false`). The response envelope is identical between preview and commit and only\nthe `preview` flag flips.\n\nAllowed transitions are constrained by merchant-configured upgrade/downgrade option rows.\nSee the discovery endpoint for sourcing legal `products_price_id` targets.\n\nSee the [Subscription Changes Skill](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md) for the full flow — [preview](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md#step-2---preview-the-change) and [commit](https://accounts.myclickfunnels.com/.well-known/subscription-changes/skill.md#step-3---commit-the-change).\n"},{"name":"Orders::Transaction","description":"Order Transactions"},{"name":"Orders::Tag","description":"> Order Tags\n\nOrder Tags are unique to each workspace, allowing for customized organization of your orders. Once created, these tags can be applied to any order within the same workspace.\n\nThis API allows you to manage the Order Tags for your workspace.\n"},{"name":"Page","description":"> Page offers extra information about ClickFunnels pages, like those that are part of funnels.\n\nIt's the main element that the user modifies when editing a Page in the ClickFunnels editor.\n\nYou can also learn how to source Page name and public ID from your ClickFunnels UI\n[here](https://developers.myclickfunnels.com/docs/filtering-by-page).\n\nSee the [Pages Skill](https://accounts.myclickfunnels.com/.well-known/pages/skill.md) for [building a page](https://accounts.myclickfunnels.com/.well-known/pages/skill.md#building-a-page) and [positioning it within a funnel](https://accounts.myclickfunnels.com/.well-known/pages/skill.md#positioning-a-page-within-a-funnel); the page body is authored in PML — see the [Page Markup Skill](https://accounts.myclickfunnels.com/.well-known/page-markup/skill.md). For pages you host yourself, see [Create an External Page](https://accounts.myclickfunnels.com/.well-known/sdk/create-external-page/skill.md) and [Add Checkout to an External Page](https://accounts.myclickfunnels.com/.well-known/sdk/add-checkout/skill.md). To move those externally-hosted pages to a new domain, see [Migrate an External Page Domain](https://accounts.myclickfunnels.com/.well-known/sdk/migrate-external-page-domain/skill.md).\n"},{"name":"Product","description":"> Products can be used to create and edit sellable goods.\n\nProducts have a few boolean attributes including `archived`, `visible_in_store`, and `visible_in_customer_center`.\n\nProducts that are not `archived` are in a `live` state if they are `visible_in_store` or `visible_in_customer_center` or are associated with any live funnels.\n\n`Live` products cannot be archived.\nProducts in an `archived` state can always be unarchived.\n\nEach product can have one or more variants expressed as a `Products::Variant`.\nAll products have a \"default variant\" that acts as a parent to any further variants\nthe product may have.\n\nWhen you create a `Product` we will implicitly create a default variant of type `digital`.\nIf the product you want to create is actually `physical`, be sure to update the type of it's\ndefault variant in a subsequent request.\n\nThe Product Object will always contain a `default_variant_id` attribute that lets you identify\nthe default variant.\n\nIf the Product will have variants you should set the `variant_properties` attribute to an array of the properties a variant can have (e.g. \"Size\", \"Color\", etc.)\n"},{"name":"Products::Collection","description":"Product Collections"},{"name":"Products::Price","description":"Product Prices"},{"name":"Products::Prices::ChangeOption","description":"> Allowed variant/price upgrade and downgrade targets for a source price.\n\nMerchant-configured rows define which variant + price combinations a subscription using a\ngiven source price may switch to. The discovery endpoint returns these grouped by target\nvariant; each group lists the prices on that target variant the subscription may move to.\n\nUse the returned `products_price_id`s as the body's `products_price_id` on\n`POST /orders/line_items/:line_item_id/changes` (preview) or\n`POST /orders/line_items/:line_item_id/changes/perform` (commit).\n\nSee [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).\n"},{"name":"Products::Variant","description":"> Product variants\n\nIf there are multiple variants of a product (like when a T-shirt can come in many sizes or colors),\nthen these should be created as `Products::Variant` records related to the `Product` record.\n\nWhen creating a variant it is mandatory to set the `properties_values` so that all the Product's `variant_properties` have a value.\n\nAll products have a \"default variant\". Attributes like the below, if left as `null` on a variant (that is not the default)\nwill inherit the value from the default variant:\n\n- `product_type`\n- `sku`\n- `taxable`\n- `tax_category_id`\n- `description`\n- `weight`\n- `weight_unit`\n- `height`\n- `width`\n- `length`\n- `image_id`\n"},{"name":"Products::Tag","description":"Product Tags"},{"name":"RefineFilter","description":"> Reusable audience filters that scope contacts for conditional splits, email broadcasts, workflow branches, and other ClickFunnels surfaces.\n\nA RefineFilter stores a named, conjunctive set of criteria (attribute + clause + value) scoped to a workspace. Once created, pass its `id` as `condition.filter_id` on a Conditional Split Step, or as `filter_id` on any other surface that accepts one.\n\nSee the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md) for a full reference of supported attributes, clauses, and the safe-condition policy.\n\nThe public API restricts filter conditions to a [safe whitelist](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#safe-condition-whitelist); requests outside it return 422 with a pointer to the dev community.\n\nFor applying a filter to a Conditional Split Step, see [Applying filters to conditional split steps](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#applying-filters-to-conditional-split-steps). For email broadcasts, see [Applying filters to email broadcasts](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#applying-filters-to-email-broadcasts).\n"},{"name":"Sales::Pipeline","description":"> Sales Pipelines\n\nPipelines allow you to organize, track and advance Opportunies between different Stages. A Pipeline consists of multiple Stages.\n\nWhen creating a Pipeline, you must specify one or more stages by passing them in the `stages_attributes` parameter. The Stages\nwill be created in the order in which they are given in the `stages_attributes` parameter.\n"},{"name":"Sales::Pipelines::Stage","description":"> Sales Pipeline Stages\n\nStages belong to a Pipeline, and allow you to track and advance Opportunities.\n\nYou can re-order Stages in a Pipeline by updating the `sort_order` attribute of a Stage, giving the desired position of the Stage.\nSort order values are zero-indexed, with 0 being the first stage of a pipeline.\n\nCurrently, it's not possible to delete a stage if it's the last one left in the Pipeline.\n"},{"name":"Sales::Opportunity","description":"> Sales Opportunities\n\nSales Opportunities are initially created in a specific stage of a Pipeline and can be moved between different stages within that Pipeline.\n\nEach Sales Opportunity requires a name and a reference to a Primary Contact. If the Opportunity is associated with a new Contact, you must first create the Contact using the Contacts API.\n\nThe `value` field, which is optional, represents the potential value of the Opportunity in the default currency of the Workspace.\n\nYou can assign an Opportunity to a Team Member using the `assignee_id` field. To reassign the Opportunity to a different team member, simply update this value. To remove the assignee, set the `assignee_id` to `null`. The `assignee_id` corresponds to the `membership.id` in the relevant Team, which can be retrieved using the Teams API.\n\nWhen an Opportunity is moved to a stage with a `close_probability` value of 0 or 100, the `closed_at` timestamp is automatically set. If the Opportunity is later moved to a different stage, the `closed_at` timestamp remains unchanged. You can also manually set the `closed_at` timestamp using the API.\n"},{"name":"Sales::Opportunities::Note","description":"Sales Opportunity Notes"},{"name":"Shipping::LocationGroup","description":"Shipping LocationGroup"},{"name":"Shipping::Package","description":"Shipping Package"},{"name":"Shipping::Profile","description":"Shipping Profile"},{"name":"Shipping::Rate","description":"Shipping Rate"},{"name":"Shipping::Zone","description":"Shipping Zone"},{"name":"Shipping::Rates::Name","description":"Shipping Rate Names"},{"name":"Store","description":"> Stores\n"},{"name":"Style","description":"> Styles determine some CSS specifics for a theme.\n"},{"name":"Theme","description":"> Themes determine the look of the user-facing ClickFunnels pages.\n\nA theme bundles the relevant site pages, like home page, storefront, course pages, etc.\n"},{"name":"Webhooks::Outgoing::Endpoint","description":"Webhook Outgoing Endpoints"},{"name":"Webhooks::Outgoing::Event","description":"Webhooks Outgoing Events"},{"name":"Webhooks::Outgoing::EventType","description":"The authoritative catalog of webhook event types available for subscription. Use this endpoint to discover the exact string keys to supply in `event_type_ids` when creating or updating a webhook endpoint — do not guess event type identifiers or rely solely on external documentation.\n"},{"name":"Workflow","description":"Standalone automation workflows that enroll contacts and execute a sequence of action steps (send email, apply tag, delay, split, etc.). A workflow is either `draft` (no active triggers), `live` (enabled with at least one active trigger), or `archived`.\n\nRelated sub-resources: Workflows::Trigger, Workflows::Step, Workflows::Run.\n\nSee the [Workflows Skill](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md) for the end-to-end guide — lifecycle, [creating a workflow](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#creating-a-workflow), [triggers](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#triggers), [steps](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#steps), [branching](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#branching), [enabling/disabling](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#enabling-disabling), and [manual enrollment](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#runs---manual-enrollment).\n"},{"name":"Workflows::Trigger","description":"Triggers attached to a workflow. Each trigger specifies an `event_type_key` (e.g. `$contact.tag_applied`) and optional condition FK ids that narrow which events fire the trigger.\n\nSee [Triggers](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#triggers) in the [Workflows Skill](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md).\n"},{"name":"Workflows::Step","description":"Action and split steps within a workflow. The step `type` (e.g. `send_email_step`, `delay_step`, `conditional_split_step`) is conveyed via the `step_type_settings` map — the single key in that map is always the step type.\n\nSee [Steps](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#steps) and [Branching](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#branching) in the [Workflows Skill](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md).\n"},{"name":"Workflows::Run","description":"Execution records tracking a contact's progress through a workflow. Status is derived: `active`, `paused`, `completed`, or `canceled`. Runs can be listed/filtered or manually created to enroll a contact immediately.\n\nSee [Runs - manual enrollment](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md#runs---manual-enrollment) in the [Workflows Skill](https://accounts.myclickfunnels.com/.well-known/workflows/skill.md).\n"}],"externalDocs":{"description":"More in-depth guides and further resources","url":"https://developers.myclickfunnels.com"},"servers":[{"url":"https://{subdomain}.myclickfunnels.com/api/v2","description":"ClickFunnels API","variables":{"subdomain":{"default":"myworkspace"}}}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"TeamAttributes":{"type":"object","title":"Teams","description":"Teams","properties":{"id":{"type":"integer","description":"Team ID"},"public_id":{"type":["string","null"],"description":"Team public ID"},"name":{"type":"string","description":"The name of your Team"},"time_zone":{"type":["string","null"],"description":"The human-readable time zone set manually by a ClickFunnels user or dynamically by the app.\nRead more about time zones and how to map them back to the TZ standard in [our Time Zones guide.](https://dash.readme.com/project/cf2/v2/docs/timezones).\n"},"locale":{"type":"string","description":"The main language used to create a new website.","enum":["en","ja","pt"]},"created_at":{"type":["string","null"],"format":"date-time","description":"Created"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"},"billing_subscriptions":{"type":"array","description":"The team's billing subscriptions. Present only when the team has at least one subscription (omitted entirely otherwise).","items":{"$ref":"#/components/schemas/BillingSubscriptionAttributes"}},"memberships":{"type":"array","description":"The team's non-platform (human) memberships. Platform-agent / bot memberships (such as the API client the request authenticates as) are excluded from this list.","items":{"$ref":"#/components/schemas/MembershipAttributes"}}},"example":{"id":42000,"public_id":"ClNcfI","name":"Example Team","time_zone":"Pacific Time (US & Canada)","locale":"en","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","billing_subscriptions":[{"id":8000,"public_id":"SbTcfQ","team_id":42000,"status":"active","cycle_ends_at":"2025-02-01T00:00:00.000Z","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","included_prices":[{"id":9000,"subscription_id":8000,"price_id":"price_basic_monthly","quantity":1,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"}]}],"memberships":[{"id":5000,"public_id":"MbRcfK","team_id":42000,"user_id":1,"user_first_name":"Lili","user_last_name":"Stiedemann","user_profile_photo_id":null,"user_email":"test@email.com","added_by_id":null,"platform_agent_of_id":null,"role_ids":["admin"],"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","user":{"id":1,"public_id":"prbtEx","email":"test@email.com","first_name":"Lili","last_name":"Stiedemann","time_zone":"Pacific Time (US & Canada)","locale":"en","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"}}]},"required":["created_at","id","locale","name","public_id","time_zone","updated_at"]},"MembershipAttributes":{"type":"object","title":"Memberships","description":"A membership joins a user to a team. Embedded in the `Team` resource's `memberships` array (platform-agent / bot memberships are excluded there).","properties":{"id":{"type":"integer","description":"Membership ID"},"public_id":{"type":["string","null"],"description":"Membership public ID"},"team_id":{"type":["integer","null"],"description":"The ID of the team the member belongs to"},"user_id":{"type":["integer","null"],"description":"The ID of the member's user record"},"user_first_name":{"type":["string","null"],"description":"The member's first name"},"user_last_name":{"type":["string","null"],"description":"The member's last name"},"user_profile_photo_id":{"type":["string","null"],"description":"Identifier of the member's profile photo attachment"},"user_email":{"type":["string","null"],"description":"The member's email address"},"added_by_id":{"type":["integer","null"],"description":"The ID of the user who added this member"},"platform_agent_of_id":{"type":["integer","null"],"description":"When present, the membership represents a platform agent acting on behalf of the referenced application."},"role_ids":{"type":["array","null"],"description":"The role identifiers granted to the member on the team","items":{"type":"string"}},"created_at":{"type":["string","null"],"format":"date-time","description":"Created"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"},"user":{"description":"The member's user profile. Present when the membership has a linked user.","$ref":"#/components/schemas/UserAttributes"}},"example":{"id":5000,"public_id":"MbRcfK","team_id":42000,"user_id":1,"user_first_name":"Lili","user_last_name":"Stiedemann","user_profile_photo_id":null,"user_email":"test@email.com","added_by_id":null,"platform_agent_of_id":null,"role_ids":["admin"],"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","user":{"id":1,"public_id":"prbtEx","email":"test@email.com","first_name":"Lili","last_name":"Stiedemann","time_zone":"Pacific Time (US & Canada)","locale":"en","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"}},"required":["added_by_id","created_at","id","platform_agent_of_id","public_id","role_ids","team_id","updated_at","user_email","user_first_name","user_id","user_last_name","user_profile_photo_id"]},"BillingSubscriptionAttributes":{"type":"object","title":"Billing Subscriptions","description":"A billing subscription for a team. Embedded in the `Team` resource's `billing_subscriptions` array.","properties":{"id":{"type":"integer","description":"Billing subscription ID"},"public_id":{"type":["string","null"],"description":"Billing subscription public ID"},"team_id":{"type":"integer","description":"The ID of the team the subscription belongs to"},"status":{"type":["string","null"],"description":"The subscription's current status (e.g. `active`, `canceled`, `delinquent`)"},"cycle_ends_at":{"type":["string","null"],"format":"date-time","description":"When the current billing cycle ends"},"created_at":{"type":["string","null"],"format":"date-time","description":"Created"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"},"included_prices":{"type":"array","description":"The prices included in the subscription","items":{"$ref":"#/components/schemas/BillingSubscriptionIncludedPriceAttributes"}}},"example":{"id":8000,"public_id":"SbTcfQ","team_id":42000,"status":"active","cycle_ends_at":"2025-02-01T00:00:00.000Z","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","included_prices":[{"id":9000,"subscription_id":8000,"price_id":"price_basic_monthly","quantity":1,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"}]},"required":["created_at","cycle_ends_at","id","included_prices","public_id","status","team_id","updated_at"]},"BillingSubscriptionIncludedPriceAttributes":{"type":"object","title":"Billing Subscription Included Prices","description":"A price included in a billing subscription.","properties":{"id":{"type":"integer","description":"Included price ID"},"subscription_id":{"type":"integer","description":"The ID of the billing subscription this price belongs to"},"price_id":{"type":"string","description":"The identifier of the underlying price"},"quantity":{"type":["integer","null"],"description":"The quantity of the price included in the subscription"},"created_at":{"type":["string","null"],"format":"date-time","description":"Created"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"}},"example":{"id":9000,"subscription_id":8000,"price_id":"price_basic_monthly","quantity":1,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["created_at","id","price_id","quantity","subscription_id","updated_at"]},"TeamParametersUpdate":{"type":"object","title":"Teams","description":"Teams","required":[],"properties":{"name":{"type":"string","description":"The name of your Team"},"time_zone":{"type":["string","null"],"description":"The human-readable time zone set manually by a ClickFunnels user or dynamically by the app.\nRead more about time zones and how to map them back to the TZ standard in [our Time Zones guide.](https://dash.readme.com/project/cf2/v2/docs/timezones).\n"},"locale":{"type":"string","description":"The main language used to create a new website.","enum":["en","ja","pt"],"default":"en"}},"example":{"team":{"name":"Example Team","time_zone":"Pacific Time (US & Canada)","locale":"en"}}},"UserAttributes":{"type":"object","title":"Profile","description":"A user profile. This includes **platform-agent** users — the synthetic user an OAuth/API\nclient authenticates as (e.g. \"Default API Client\") — as well as human users. Workflow\n`notify_step` targets exclude platform agents (they resolve against non-platform team\nmembers); discover those via `GET /api/v2/teams/{team_id}/memberships`.\n","properties":{"id":{"type":"integer","description":"User ID"},"public_id":{"type":["string","null"],"description":"User public ID"},"email":{"type":"string","description":"Email Address"},"first_name":{"type":"string","description":"First Name"},"last_name":{"type":"string","description":"Last Name"},"time_zone":{"type":["string","null"],"description":"Your Time Zone"},"locale":{"type":["string","null"],"description":"Language"},"created_at":{"type":["string","null"],"format":"date-time","description":"Signed up"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"}},"example":{"id":1,"public_id":"prbtEx","email":"test@email.com","first_name":"Lili","last_name":"Stiedemann","time_zone":"Pacific Time (US & Canada)","locale":"en","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["created_at","email","first_name","id","last_name","locale","public_id","time_zone","updated_at"]},"UserParametersUpdate":{"type":"object","title":"Profile","description":"Profile","required":["email","first_name","last_name"],"properties":{"email":{"type":"string","description":"Email Address"},"first_name":{"type":"string","description":"First Name"},"last_name":{"type":"string","description":"Last Name"},"time_zone":{"type":["string","null"],"description":"Your Time Zone"},"locale":{"type":["string","null"],"description":"Language"}},"example":{"user":{"email":"test@email.com","first_name":"Lili","last_name":"Stiedemann","time_zone":"Pacific Time (US & Canada)","locale":"en"}}},"WorkspaceAttributes":{"type":"object","title":"Workspaces","description":"Workspaces","properties":{"id":{"type":"integer","description":"Workspace ID"},"public_id":{"type":["string","null"],"description":"Workspace public ID"},"team_id":{"type":"integer","description":"Team ID"},"name":{"type":"string","description":"Workspace Name"},"subdomain":{"type":"string","description":"Subdomain"},"created_at":{"type":["string","null"],"format":"date-time","description":"Added"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"}},"example":{"id":42000,"public_id":"CblaAF","team_id":42000,"name":"Example Workspace","subdomain":"example","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["created_at","id","name","public_id","subdomain","team_id","updated_at"]},"WorkspaceParameters":{"type":"object","title":"Workspaces","description":"Workspaces","required":[],"properties":{"name":{"type":"string","description":"Workspace Name"},"subdomain":{"type":"string","description":"The subdomain can currently only be changed in rare cases right after the creation of your new workspace."}},"example":{"workspace":{"name":"My Workspace","subdomain":"mysubdomain"}}},"WorkspaceParametersUpdate":{"type":"object","title":"Workspaces","description":"Workspaces","required":[],"properties":{"name":{"type":"string","description":"Workspace Name"},"subdomain":{"type":"string","description":"The subdomain can currently only be changed in rare cases right after the creation of your new workspace."}},"example":{"workspace":{"name":"My Workspace","subdomain":"mysubdomain"}}},"AddressesCountryAttributes":{"type":"object","title":"Country","description":"A country reference record.","required":["has_regions","iso2","iso3","localized_name","name"],"properties":{"iso2":{"type":"string","description":"ISO 3166-1 alpha-2 code (e.g. \"US\"). Pass this as country_code when setting an address."},"iso3":{"type":"string","description":"ISO 3166-1 alpha-3 code (e.g. \"USA\")."},"name":{"type":"string","description":"English country name (e.g. \"United States\")."},"localized_name":{"type":"string","description":"Country name localized to the request's locale."},"has_regions":{"type":"boolean","description":"True if the country has regions/states to choose from."}},"example":{"iso2":"US","iso3":"USA","name":"United States","localized_name":"United States","has_regions":true}},"AddressesRegionAttributes":{"type":"object","title":"Region","description":"A region (state/province) of a country.","required":["code","country_code","localized_name","name"],"properties":{"code":{"type":["string","null"],"description":"Region/state code (e.g. \"CA\"). Pass this (or name) as the address region value."},"name":{"type":"string","description":"Region/state name (e.g. \"California\")."},"localized_name":{"type":"string","description":"Region name localized to the request's locale."},"country_code":{"type":"string","description":"The country's ISO 3166-1 alpha-2 code."}},"example":{"code":"CA","name":"California","localized_name":"California","country_code":"US"}},"AppointmentsScheduledEventAttributes":{"type":"object","title":"Scheduled events","description":"Scheduled events","properties":{"id":{"type":"integer","description":"Scheduled event ID"},"public_id":{"type":["string","null"],"description":"The unique public identifier for the scheduled event"},"workspace_id":{"type":"integer","description":"Workspace ID"},"start_on":{"type":"string","format":"date-time","description":"Event Start Time"},"end_on":{"type":["string","null"],"format":"date-time","description":"End On"},"status":{"type":["string","null"],"description":"Status"},"max_invitees":{"type":["integer","null"],"description":"Max Invitees"},"order_id":{"type":["string","null"],"description":"Event Payment Order"},"comments":{"type":["string","null"],"description":"Please share anything that will help prepare for our meeting."},"tzid":{"type":["string","null"],"description":"Timezone"},"created_at":{"type":["string","null"],"format":"date-time","description":"Added"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"},"event_type":{"type":["object","null"],"title":"Scheduled events","description":"Event type information (can be null in rare cases if the event type has been deleted, but the event record wasn't)","properties":{"name":{"type":["string","null"],"description":"The display name of the scheduled event, typically including event type and invitee information"}}},"primary_contact":{"type":["object","null"],"title":"Scheduled events","description":"Scheduled events","properties":{"id":{"type":"integer","description":"Scheduled event ID"},"public_id":{"type":["string","null"],"description":"The unique public identifier for the scheduled event"},"email_address":{"type":["string","null"],"description":"The email address of the primary invitee for this scheduled event"},"first_name":{"type":["string","null"],"description":"The first name of the primary invitee for this scheduled event"},"last_name":{"type":["string","null"],"description":"The last name of the primary invitee for this scheduled event"},"phone_number":{"type":["string","null"],"description":"The phone number of the primary invitee for this scheduled event"}}}},"example":{"id":1,"public_id":"mdheDs","workspace_id":42000,"start_on":"2025-01-01T00:00:00.000Z","end_on":"2025-01-01T00:00:00.000Z","status":"scheduled","max_invitees":1,"order_id":null,"comments":"This is an example scheduled event for testing purposes.","tzid":"America/Los_Angeles","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","event_type":{"name":"30 Minute Meeting"},"primary_contact":{"id":1,"public_id":"uONtxf","email_address":"test-5cc06c0232058b060025@example.com","first_name":"Shanita","last_name":"Lockman","phone_number":"(224) 508-1342 x59891"}},"required":["comments","created_at","end_on","event_type","id","max_invitees","order_id","primary_contact","public_id","start_on","status","tzid","updated_at","workspace_id"]},"AppointmentsScheduledEventParameters":{"type":"object","title":"Scheduled events","description":"Scheduled events","required":["start_on"],"properties":{"start_on":{"type":"string","format":"date-time","description":"Event Start Time"},"end_on":{"type":["string","null"],"format":"date-time","description":"End On"},"status":{"type":["string","null"],"description":"Status"},"max_invitees":{"type":["integer","null"],"description":"Max Invitees"},"order_id":{"type":["string","null"],"description":"Event Payment Order"},"comments":{"type":["string","null"],"description":"Please share anything that will help prepare for our meeting."},"tzid":{"type":["string","null"],"description":"Timezone"}},"example":{"appointments_scheduled_event":{"start_on":"2025-01-01T00:00:00.000Z","end_on":"2025-01-01T00:00:00.000Z","status":"scheduled","max_invitees":1,"order_id":null,"comments":"This is an example scheduled event for testing purposes.","tzid":"America/Los_Angeles"}}},"AppointmentsScheduledEventParametersUpdate":{"type":"object","title":"Scheduled events","description":"Scheduled events","required":["start_on"],"properties":{"start_on":{"type":"string","format":"date-time","description":"Event Start Time"},"end_on":{"type":["string","null"],"format":"date-time","description":"End On"},"status":{"type":["string","null"],"description":"Status"},"max_invitees":{"type":["integer","null"],"description":"Max Invitees"},"order_id":{"type":["string","null"],"description":"Event Payment Order"},"comments":{"type":["string","null"],"description":"Please share anything that will help prepare for our meeting."},"tzid":{"type":["string","null"],"description":"Timezone"}},"example":{"appointments_scheduled_event":{"start_on":"2025-01-01T00:00:00.000Z","end_on":"2025-01-01T00:00:00.000Z","status":"scheduled","max_invitees":1,"order_id":null,"comments":"This is an example scheduled event for testing purposes.","tzid":"America/Los_Angeles"}}},"BlogAttributes":{"type":"object","title":"Blogs","description":"Blogs","properties":{"id":{"type":"integer","description":"Blog ID"},"public_id":{"type":"string","description":"The public identifier of the blog"},"workspace_id":{"type":"integer","description":"Workspace ID that the blog belongs to"},"site_id":{"type":["integer","null"],"description":"Site ID that the blog belongs to"},"name":{"type":"string","description":"Name of the blog"},"current_path":{"type":"string","description":"The URL path for the blog"},"url":{"type":"string","description":"The full public URL of the blog"},"theme_id":{"type":["integer","null"],"description":"Theme ID for the blog"},"resolved_template_page_id":{"type":["integer","null"],"description":"Effective Page ID used to render the blog index"},"resolved_post_template_page_id":{"type":["integer","null"],"description":"Effective Page ID used to render individual blog posts"},"resolved_category_template_page_id":{"type":["integer","null"],"description":"Effective Page ID used to render blog category archives"},"style_id":{"type":["integer","null"],"description":"Style ID for the blog"},"seo_image_id":{"type":["integer","null"],"description":"Default sharing image ID for the blog"},"seo_title":{"type":["string","null"],"description":"Default Blog title for SEO"},"seo_description":{"type":["string","null"],"description":"Default Blog description for SEO"},"created_at":{"type":"string","format":"date-time","description":"Created at"},"updated_at":{"type":"string","format":"date-time","description":"Updated at"}},"example":{"id":1,"public_id":"aBcDeF","workspace_id":42000,"site_id":10,"name":"My Blog","current_path":"/blog","url":"https://myworkspace.myclickfunnels.com/blog","theme_id":5,"resolved_template_page_id":101,"resolved_post_template_page_id":102,"resolved_category_template_page_id":103,"style_id":null,"seo_image_id":null,"seo_title":"My Blog - Latest Articles","seo_description":"Read our latest articles and updates.","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["created_at","current_path","id","name","public_id","resolved_category_template_page_id","resolved_post_template_page_id","resolved_template_page_id","seo_description","seo_image_id","seo_title","site_id","style_id","theme_id","updated_at","url","workspace_id"]},"BlogParameters":{"type":"object","title":"Blogs","description":"Blogs","properties":{"name":{"type":"string","description":"Name of the blog"},"seo_title":{"type":["string","null"],"description":"Default Blog title for SEO"},"seo_description":{"type":["string","null"],"description":"Default Blog description for SEO"},"seo_image_id":{"type":["integer","null"],"description":"Default sharing image ID"},"theme_id":{"type":["integer","null"],"description":"Theme ID for the blog"}},"example":{"blog":{"name":"My Updated Blog","seo_title":"My Blog - Latest Articles","seo_description":"Read our latest articles and updates.","seo_image_id":null,"theme_id":5}}},"BlogsPostAttributes":{"type":"object","title":"Blogs::Posts","description":"Blog Posts","properties":{"id":{"type":"integer","description":"Post ID"},"public_id":{"type":"string","description":"The public identifier of the post"},"blog_id":{"type":"integer","description":"Blog ID that the post belongs to"},"title":{"type":"string","description":"Title of the post"},"published_at":{"type":["string","null"],"format":"date-time","description":"Date and time the post was published"},"current_path":{"type":"string","description":"The URL path for the post. Use the value returned here rather than composing a post URL yourself. 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)."},"url":{"type":"string","description":"The full public URL of the post"},"visibility":{"type":"string","description":"Visibility status of the post. One of `draft`, `public`, `members_only`, or `scheduled`.","enum":["draft","public","members_only","scheduled"]},"excerpt_content":{"type":["string","null"],"description":"Short summary of the blog post"},"seo_title":{"type":["string","null"],"description":"SEO page title"},"seo_description":{"type":["string","null"],"description":"SEO page description"},"image_id":{"type":["integer","null"],"description":"Featured image ID"},"image_url":{"type":["string","null"],"description":"URL of the featured image"},"categories":{"type":"array","description":"Categories associated with the post","items":{"type":"object","properties":{"name":{"type":"string","description":"Category name"}}}},"tags":{"type":"array","description":"Tags associated with the post","items":{"type":"object","properties":{"name":{"type":"string","description":"Tag name"}}}},"authors":{"type":"array","description":"Authors associated with the post","items":{"type":"object","properties":{"first_name":{"type":"string","description":"Author's first name"},"last_name":{"type":"string","description":"Author's last name"},"email_address":{"type":"string","description":"Author's email address"}}}},"markup":{"type":"string","description":"**Expandable** The PML (Page Markup Language) representation of the post's visual content. Only returned when expand[]=markup is provided. This serialization is lossy: elements PML has no equivalent for are omitted with no error and no placeholder, so a round-tripped read is not a safe basis for rewriting a post (see [the approval guardrail](https://accounts.myclickfunnels.com/.well-known/page-markup/skill.md#stop-get-approval-before-overwriting-an-existing-page)). An empty string therefore does not prove the post is empty: a post built entirely from elements PML cannot express also reads back empty. The value `` means the read failed; treat the post as unreadable and do not write that string back. See the [Page Markup Skill](https://accounts.myclickfunnels.com/.well-known/page-markup/skill.md) for the full DSL reference."},"created_at":{"type":"string","format":"date-time","description":"Created at"},"updated_at":{"type":"string","format":"date-time","description":"Updated at"}},"example":{"id":1,"public_id":"xYzAbC","blog_id":1,"title":"Getting started with your blog","published_at":"2025-06-01T10:00:00.000Z","current_path":"/blog/getting-started","url":"https://myworkspace.myclickfunnels.com/blog/getting-started","visibility":"public","excerpt_content":"An introduction to what you'll find on this blog.","seo_title":"Getting started with your blog","seo_description":"Learn how to make the most of your new blog.","image_id":42,"image_url":"https://example.myclickfunnels.com/uploads/image/42/file/example.jpg","categories":[{"name":"Tutorials"}],"tags":[{"name":"beginner"}],"authors":[{"first_name":"Jane","last_name":"Smith","email_address":"jane@example.com"}],"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-06-01T10:00:00.000Z"},"required":["authors","blog_id","categories","created_at","current_path","excerpt_content","id","image_id","image_url","public_id","published_at","seo_description","seo_title","tags","title","updated_at","url","visibility"]},"BlogsPostParameters":{"type":"object","title":"Blogs::Posts","description":"Blog Posts","properties":{"title":{"type":"string","description":"Title of the post"},"visibility":{"type":"string","description":"Visibility status. One of `draft`, `public`, `members_only`, or `scheduled`. See [Two gotchas worth knowing](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md#two-gotchas-worth-knowing) in the [Blogs Skill](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md).","enum":["draft","public","members_only","scheduled"]},"published_at":{"type":["string","null"],"format":"date-time","description":"Date and time to publish the post. Required when visibility is `scheduled`. See [Publish separately](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#7-publish-separately) in the [Import External Blog Post Skill](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md)."},"excerpt_content":{"type":["string","null"],"description":"Short summary of the blog post"},"seo_title":{"type":["string","null"],"description":"SEO page title"},"seo_description":{"type":["string","null"],"description":"SEO page description"},"image_id":{"type":["integer","null"],"description":"Featured image ID. When importing an article, its images need rehosting first: see [Rehost source images during a migration](https://accounts.myclickfunnels.com/.well-known/blogs/skill.md#rehost-source-images-during-a-migration) and the [image caveat](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#image-caveat)."},"markup":{"type":["string","null"],"description":"PML (Page Markup Language) that builds the post's content tree (its page_content) — this IS the post body that renders. Replaces the existing tree, published version and editor draft alike. PML covers only a subset of what the ClickFunnels editor can build, so writing this to a post that already has a body silently drops editor-built content it cannot express. **If the post could have been written or edited in the ClickFunnels editor, stop and get explicit approval from the user before sending this on update** (a general instruction to update the post does not count): 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 leave the body untouched and change only metadata. Validated before any DB write; invalid markup returns 400 and the post is not created or updated. Markup that stops mid-construct is treated as truncated and rejected with a 400 — re-send the complete document rather than the missing tail. See the [Page Markup Skill](https://accounts.myclickfunnels.com/.well-known/page-markup/skill.md) for the DSL itself. Raw HTML from another site is not PML; normalize and wrap it as described in [Normalize external HTML for PML](https://accounts.myclickfunnels.com/.well-known/blogs/import-external-post/skill.md#3-normalize-external-html-for-pml)."},"author_ids":{"type":"array","description":"IDs of authors to associate with the post","items":{"type":"integer"}},"tag_ids":{"type":"array","description":"IDs of tags to associate with the post","items":{"type":"integer"}},"category_ids":{"type":"array","description":"IDs of categories to associate with the post","items":{"type":"integer"}}},"example":{"blogs_post":{"title":"Getting started with your blog","visibility":"draft","published_at":null,"excerpt_content":"An introduction to what you'll find on this blog.","seo_title":"Getting started with your blog","seo_description":"Learn how to make the most of your new blog.","image_id":null,"markup":"
Hi everyone, excited to be here.
"}}},"CommunitiesSpacesPostParametersUpdate":{"type":"object","title":"Communities::Spaces::Post","description":"Communities::Spaces::Post","properties":{"title":{"type":["string","null"],"description":"Post title"},"body":{"type":["string","null"],"description":"Post body as rich HTML"},"image_id":{"type":["integer","null"],"description":"Cover image ID"},"is_pinned":{"type":["boolean","null"],"description":"Whether to pin the post at the top of the space"},"current_path":{"type":["string","null"],"description":"Current path (used for tracking purposes)"}},"example":{"communities_spaces_post":{"title":"Updated post title","is_pinned":true}}},"CommunitiesSpacesPostsCommentAttributes":{"type":"object","title":"Communities::Spaces::Post::Comment","description":"Communities::Spaces::Post::Comment","properties":{"id":{"type":"integer","description":"Comment ID"},"public_id":{"type":["string","null"],"description":"Comment public ID"},"contact_id":{"type":["integer","null"],"description":"ID of the Contact who authored the comment"},"body":{"type":["string","null"],"description":"Comment body as plain text"},"url":{"type":["string","null"],"description":"Canonical URL of the comment"},"contact":{"description":"Short representation of the authoring Contact, or null if the contact has been deleted","type":["object","null"],"properties":{"id":{"type":"integer","description":"Contact ID"},"public_id":{"type":"string","description":"Contact public ID"},"email_address":{"type":["string","null"],"description":"Contact email address"},"first_name":{"type":["string","null"],"description":"Contact first name"},"last_name":{"type":["string","null"],"description":"Contact last name"},"phone_number":{"type":["string","null"],"description":"Contact phone number"}}},"group":{"description":"The Space Group the parent post belongs to","type":"object","properties":{"id":{"type":"integer","description":"Space Group ID"},"public_id":{"type":["string","null"],"description":"Space Group public ID"},"name":{"type":["string","null"],"description":"Space Group name"}}},"post":{"description":"The Post this comment belongs to","type":"object","properties":{"id":{"type":"integer","description":"Post ID"},"public_id":{"type":["string","null"],"description":"Post public ID"},"title":{"type":["string","null"],"description":"Post title"},"url":{"type":["string","null"],"description":"Post canonical URL"}}},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at"}},"example":{"id":202,"public_id":"MnOpQr","contact_id":55,"body":"Great post, thanks for sharing!","url":"https://example.myclickfunnels.com/communities/posts/AbCdEf/comments/MnOpQr","contact":{"id":55,"public_id":"GhIjKl","email_address":"jane@example.com","first_name":"Jane","last_name":"Doe","phone_number":null},"group":{"id":1,"public_id":"BcDeFg","name":"General"},"post":{"id":101,"public_id":"AbCdEf","title":"Welcome to the community!","url":"https://example.myclickfunnels.com/communities/posts/AbCdEf"},"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["body","contact","contact_id","created_at","group","id","post","public_id","updated_at","url"]},"CommunitiesSpacesPostsCommentParameters":{"type":"object","title":"Communities::Spaces::Post::Comment","description":"Communities::Spaces::Post::Comment","required":["body"],"properties":{"body":{"type":"string","description":"Comment body as rich HTML"},"contact_id":{"type":["integer","null"],"description":"ID of the Contact to author the comment. Optional — defaults to the connected user's own contact."},"parent_comment_id":{"type":["integer","null"],"description":"ID of the parent comment for threaded replies. Must be a comment on the same post."},"skip_notifications":{"type":["boolean","null"],"description":"When true, suppresses email/push notifications for this comment"}},"example":{"communities_spaces_posts_comment":{"body":"Great post, thanks for sharing!
"}}},"CommunitiesSpacesPostsCommentParametersUpdate":{"type":"object","title":"Communities::Spaces::Post::Comment","description":"Communities::Spaces::Post::Comment","properties":{"body":{"type":["string","null"],"description":"Comment body as rich HTML"},"skip_notifications":{"type":["boolean","null"],"description":"When true, suppresses email/push notifications for this comment"}},"example":{"communities_spaces_posts_comment":{"body":"Updated comment text.
"}}},"CommunitiesSpacesPostsLikeAttributes":{"type":"object","title":"Communities::Spaces::Post::Like","description":"Communities::Spaces::Post::Like","properties":{"id":{"type":"integer","description":"Like ID"},"public_id":{"type":["string","null"],"description":"Like public ID"},"post_id":{"type":"integer","description":"ID of the Post that was liked"},"contact":{"description":"Short representation of the Contact who liked the post, or null if the contact has been deleted","type":["object","null"],"properties":{"id":{"type":"integer","description":"Contact ID"},"public_id":{"type":"string","description":"Contact public ID"},"email_address":{"type":["string","null"],"description":"Contact email address"},"first_name":{"type":["string","null"],"description":"Contact first name"},"last_name":{"type":["string","null"],"description":"Contact last name"},"phone_number":{"type":["string","null"],"description":"Contact phone number"}}},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at"}},"example":{"id":301,"public_id":"StUvWx","post_id":101,"contact":{"id":55,"public_id":"GhIjKl","email_address":"jane@example.com","first_name":"Jane","last_name":"Doe","phone_number":null},"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["contact","created_at","id","post_id","public_id","updated_at"]},"CommunitiesSpacesPostsLikeParameters":{"type":"object","title":"Communities::Spaces::Post::Like","description":"Communities::Spaces::Post::Like","properties":{"contact_id":{"type":["integer","null"],"description":"ID of the Contact to record the like for. Optional — defaults to the connected user's own contact."}},"example":{"communities_spaces_posts_like":{}}},"CommunitiesSpacesPostsCommentsLikeAttributes":{"type":"object","title":"Communities::Spaces::Post::Comment::Like","description":"Communities::Spaces::Post::Comment::Like","properties":{"id":{"type":"integer","description":"Like ID"},"public_id":{"type":["string","null"],"description":"Like public ID"},"comment_id":{"type":"integer","description":"ID of the Comment that was liked"},"contact":{"description":"Short representation of the Contact who liked the comment, or null if the contact has been deleted","type":["object","null"],"properties":{"id":{"type":"integer","description":"Contact ID"},"public_id":{"type":"string","description":"Contact public ID"},"email_address":{"type":["string","null"],"description":"Contact email address"},"first_name":{"type":["string","null"],"description":"Contact first name"},"last_name":{"type":["string","null"],"description":"Contact last name"},"phone_number":{"type":["string","null"],"description":"Contact phone number"}}},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at"}},"example":{"id":401,"public_id":"YzAbCd","comment_id":202,"contact":{"id":55,"public_id":"GhIjKl","email_address":"jane@example.com","first_name":"Jane","last_name":"Doe","phone_number":null},"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["comment_id","contact","created_at","id","public_id","updated_at"]},"CommunitiesSpacesPostsCommentsLikeParameters":{"type":"object","title":"Communities::Spaces::Post::Comment::Like","description":"Communities::Spaces::Post::Comment::Like","properties":{"contact_id":{"type":["integer","null"],"description":"ID of the Contact to record the like for. Optional — defaults to the connected user's own contact."}},"example":{"communities_spaces_posts_comments_like":{}}},"CommunitiesSpacesPostsVideoEmbedAttributes":{"type":"object","title":"Communities::Spaces::Post::VideoEmbed","description":"Communities::Spaces::Post::VideoEmbed","properties":{"id":{"type":"integer","description":"Video Embed ID"},"public_id":{"type":["string","null"],"description":"Video Embed public ID"},"post_id":{"type":"integer","description":"ID of the Post the video is attached to"},"provider":{"type":["string","null"],"enum":["youtube","vimeo","loom","voomly",null],"description":"Video provider name, auto-detected from the URL. One of youtube, vimeo, loom, voomly."},"url":{"type":["string","null"],"description":"Source URL of the video"},"data":{"description":"Provider-specific metadata (arbitrary key/value pairs)","type":["object","null"]},"workspace_id":{"type":["integer","null"],"description":"Workspace ID the post belongs to"},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at"}},"example":{"id":501,"public_id":"EfGhIj","post_id":101,"provider":"youtube","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","data":{"video_id":"dQw4w9WgXcQ","duration":212},"workspace_id":42,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["created_at","data","id","post_id","provider","public_id","updated_at","url","workspace_id"]},"CommunitiesSpacesPostsVideoEmbedParameters":{"type":"object","title":"Communities::Spaces::Post::VideoEmbed","description":"Communities::Spaces::Post::VideoEmbed","required":["url"],"properties":{"url":{"type":"string","description":"Source URL of the video"},"provider":{"type":["string","null"],"enum":["youtube","vimeo","loom","voomly",null],"description":"Video provider name. Optional and effectively ignored — the provider is auto-detected from the URL on save (set_provider before_save). One of youtube, vimeo, loom, voomly."},"data":{"description":"Provider-specific metadata (arbitrary key/value pairs)","type":["object","null"]}},"example":{"communities_spaces_posts_video_embed":{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","provider":"youtube"}}},"CommunitiesMembershipAttributes":{"type":"object","title":"Communities::Membership","description":"Communities::Membership","properties":{"id":{"type":"integer","description":"Membership ID"},"public_id":{"type":["string","null"],"description":"Membership public ID"},"community_id":{"type":"integer","description":"ID of the Community this membership belongs to"},"moderator":{"type":["boolean","null"],"description":"Whether this member has moderator privileges in the community"},"created_at":{"type":"string","format":"date-time","description":"Created at"},"updated_at":{"type":"string","format":"date-time","description":"Updated at"},"contact":{"type":["object","null"],"description":"The member Contact (null if the contact has been removed)","properties":{"id":{"type":"integer","description":"Contact ID"},"public_id":{"type":["string","null"],"description":"Contact public ID"},"email_address":{"type":["string","null"],"description":"Contact email address"},"first_name":{"type":["string","null"],"description":"Contact first name"},"last_name":{"type":["string","null"],"description":"Contact last name"},"phone_number":{"type":["string","null"],"description":"Contact phone number"}}}},"example":{"id":101,"public_id":"AbCdEf","community_id":1,"moderator":false,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","contact":{"id":55,"public_id":"GhIjKl","email_address":"member@example.com","first_name":"Jane","last_name":"Doe","phone_number":null}},"required":["community_id","contact","created_at","id","moderator","public_id","updated_at"]},"CommunitiesMembershipParameters":{"type":"object","title":"Communities::Membership","description":"Communities::Membership","required":["contact_id"],"properties":{"contact_id":{"type":"string","description":"Public ID of the Contact to add as a member"},"moderator":{"type":["boolean","null"],"description":"Whether this member should have moderator privileges"},"space_ids":{"type":["array","null"],"description":"Array of Space public IDs the member should belong to. The membership form syncs the member's Space memberships to exactly this list — Spaces not in the list are removed, Spaces in the list are added.\n","items":{"type":"string"}}},"example":{"communities_membership":{"contact_id":"GhIjKl","moderator":false,"space_ids":["SpAcEa","SpAcEb"]}}},"CommunitiesMembershipParametersUpdate":{"type":"object","title":"Communities::Membership","description":"Communities::Membership","properties":{"moderator":{"type":["boolean","null"],"description":"Whether this member should have moderator privileges"},"space_ids":{"type":["array","null"],"description":"Array of Space public IDs the member should belong to. The membership form syncs the member's Space memberships to exactly this list — Spaces not in the list are removed, Spaces in the list are added.\n","items":{"type":"string"}}},"example":{"communities_membership":{"moderator":true,"space_ids":["SpAcEa"]}}},"CommunitiesBanAttributes":{"type":"object","title":"Communities::Ban","description":"Communities::Ban","properties":{"id":{"type":"integer","description":"Ban ID"},"public_id":{"type":["string","null"],"description":"Ban public ID"},"community_id":{"type":"integer","description":"ID of the Community this ban applies to"},"bannable_type":{"type":"string","description":"Polymorphic type of the bannable scope (e.g. Community)"},"bannable_id":{"type":"integer","description":"Polymorphic ID of the bannable scope"},"banned_by_id":{"type":"integer","description":"ID of the membership record that issued the ban (set automatically)"},"reason":{"type":["string","null"],"description":"Optional reason for the ban (max 1024 characters)"},"created_at":{"type":"string","format":"date-time","description":"Created at"},"updated_at":{"type":"string","format":"date-time","description":"Updated at"},"contact":{"type":["object","null"],"description":"The banned Contact (null if the contact has been removed)","properties":{"id":{"type":"integer","description":"Contact ID"},"public_id":{"type":["string","null"],"description":"Contact public ID"},"email_address":{"type":["string","null"],"description":"Contact email address"},"first_name":{"type":["string","null"],"description":"Contact first name"},"last_name":{"type":["string","null"],"description":"Contact last name"},"phone_number":{"type":["string","null"],"description":"Contact phone number"}}}},"example":{"id":201,"public_id":"MnOpQr","community_id":1,"bannable_type":"Community","bannable_id":1,"banned_by_id":12,"reason":"Violated community guidelines","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","contact":{"id":55,"public_id":"GhIjKl","email_address":"member@example.com","first_name":"Jane","last_name":"Doe","phone_number":null}},"required":["bannable_id","bannable_type","banned_by_id","community_id","contact","created_at","id","public_id","reason","updated_at"]},"CommunitiesBanParameters":{"type":"object","title":"Communities::Ban","description":"Communities::Ban","required":["contact_id"],"properties":{"contact_id":{"type":"string","description":"Public ID of the Contact to ban"},"reason":{"type":["string","null"],"description":"Optional reason for the ban (max 1024 characters)"}},"example":{"communities_ban":{"contact_id":"GhIjKl","reason":"Violated community guidelines"}}},"CommunitiesActionAttributes":{"type":"object","title":"Async Action","description":"Base response shape shared by all community async bulk-action resources. The `status` field progresses from `queued` → `processing` → `completed`. Poll the `show` endpoint until `status` is `completed` or `performed_count` equals `target_count`.\n","properties":{"id":{"type":"integer","description":"Action ID"},"public_id":{"type":["string","null"],"description":"Action public ID"},"community_id":{"type":"integer","description":"ID of the Community this action belongs to"},"target_all":{"type":"boolean","description":"When true the action targets all eligible records in the community rather than the explicit target_ids list"},"target_ids":{"type":"array","description":"Integer IDs of the targeted records (memberships or bans)","items":{"type":"integer"}},"failed_ids":{"type":"array","description":"Integer IDs of records that could not be processed","items":{"type":"integer"}},"target_count":{"type":["integer","null"],"description":"Total number of records that will be processed"},"performed_count":{"type":["integer","null"],"description":"Number of records processed so far"},"started_at":{"type":["string","null"],"format":"date-time","description":"Timestamp when the background job began processing"},"completed_at":{"type":["string","null"],"format":"date-time","description":"Timestamp when the background job finished"},"created_at":{"type":"string","format":"date-time","description":"Created at"},"updated_at":{"type":"string","format":"date-time","description":"Updated at"},"status":{"type":"string","enum":["queued","processing","completed"],"description":"Current status of the async action. Progresses: queued → processing → completed."}},"required":["community_id","completed_at","created_at","failed_ids","id","performed_count","public_id","started_at","status","target_all","target_count","target_ids","updated_at"]},"CommunitiesMembershipsBanActionAttributes":{"type":"object","title":"Communities::Memberships::BanAction","description":"Communities::Memberships::BanAction","allOf":[{"$ref":"#/components/schemas/CommunitiesActionAttributes"},{"type":"object","properties":{"reason":{"type":["string","null"],"description":"Optional reason applied to each ban created by this action"}}}],"example":{"id":501,"public_id":"BnAcT1","community_id":1,"target_all":false,"target_ids":[101,102],"failed_ids":[],"target_count":2,"performed_count":2,"started_at":"2025-01-01T00:01:00.000Z","completed_at":"2025-01-01T00:01:05.000Z","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:01:05.000Z","status":"completed","reason":"Violated community guidelines"},"required":["community_id","completed_at","created_at","failed_ids","id","performed_count","public_id","reason","started_at","status","target_all","target_count","target_ids","updated_at"]},"CommunitiesMembershipsBanActionParameters":{"type":"object","title":"Communities::Memberships::BanAction","description":"Communities::Memberships::BanAction","properties":{"target_all":{"type":"boolean","description":"When true, ban all members in the community (target_ids is ignored)"},"target_ids":{"type":"array","description":"Array of membership public IDs to ban. Required when target_all is false.","items":{"type":"string"}},"reason":{"type":["string","null"],"description":"Optional reason applied to each ban"}},"example":{"communities_memberships_ban_action":{"target_all":false,"target_ids":["AbCdEf","GhIjKl"],"reason":"Violated community guidelines"}}},"CommunitiesMembershipsAddToGroupActionAttributes":{"type":"object","title":"Communities::Memberships::AddToGroupAction","description":"Communities::Memberships::AddToGroupAction","allOf":[{"$ref":"#/components/schemas/CommunitiesActionAttributes"},{"type":"object","properties":{"space_ids":{"type":"array","description":"Integer IDs of the spaces (groups) members are added to","items":{"type":"integer"}}}}],"example":{"id":502,"public_id":"AdGrP1","community_id":1,"target_all":false,"target_ids":[101,102],"failed_ids":[],"target_count":2,"performed_count":2,"started_at":"2025-01-01T00:01:00.000Z","completed_at":"2025-01-01T00:01:05.000Z","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:01:05.000Z","status":"completed","space_ids":[10,11]},"required":["community_id","completed_at","created_at","failed_ids","id","performed_count","public_id","space_ids","started_at","status","target_all","target_count","target_ids","updated_at"]},"CommunitiesMembershipsAddToGroupActionParameters":{"type":"object","title":"Communities::Memberships::AddToGroupAction","description":"Communities::Memberships::AddToGroupAction","properties":{"target_all":{"type":"boolean","description":"When true, add all members in the community to the specified spaces (target_ids is ignored)"},"target_ids":{"type":"array","description":"Array of membership public IDs to add to the spaces. Required when target_all is false.","items":{"type":"string"}},"space_ids":{"type":"array","description":"Array of space public IDs to add the members to","items":{"type":"string"}}},"example":{"communities_memberships_add_to_group_action":{"target_all":false,"target_ids":["AbCdEf","GhIjKl"],"space_ids":["SpAcEa","SpAcEb"]}}},"CommunitiesMembershipsRemoveFromGroupActionAttributes":{"type":"object","title":"Communities::Memberships::RemoveFromGroupAction","description":"Communities::Memberships::RemoveFromGroupAction","allOf":[{"$ref":"#/components/schemas/CommunitiesActionAttributes"},{"type":"object","properties":{"space_ids":{"type":"array","description":"Integer IDs of the spaces (groups) members are removed from","items":{"type":"integer"}}}}],"example":{"id":503,"public_id":"RmGrP1","community_id":1,"target_all":false,"target_ids":[101,102],"failed_ids":[],"target_count":2,"performed_count":2,"started_at":"2025-01-01T00:01:00.000Z","completed_at":"2025-01-01T00:01:05.000Z","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:01:05.000Z","status":"completed","space_ids":[10,11]},"required":["community_id","completed_at","created_at","failed_ids","id","performed_count","public_id","space_ids","started_at","status","target_all","target_count","target_ids","updated_at"]},"CommunitiesMembershipsRemoveFromGroupActionParameters":{"type":"object","title":"Communities::Memberships::RemoveFromGroupAction","description":"Communities::Memberships::RemoveFromGroupAction","properties":{"target_all":{"type":"boolean","description":"When true, remove all members in the community from the specified spaces (target_ids is ignored)"},"target_ids":{"type":"array","description":"Array of membership public IDs to remove from the spaces. Required when target_all is false.","items":{"type":"string"}},"space_ids":{"type":"array","description":"Array of space public IDs to remove the members from","items":{"type":"string"}}},"example":{"communities_memberships_remove_from_group_action":{"target_all":false,"target_ids":["AbCdEf","GhIjKl"],"space_ids":["SpAcEa"]}}},"CommunitiesMembershipsExportActionAttributes":{"type":"object","title":"Communities::Memberships::ExportAction","description":"Communities::Memberships::ExportAction","allOf":[{"$ref":"#/components/schemas/CommunitiesActionAttributes"},{"type":"object","properties":{"fields":{"type":"array","description":"Column names included in the export file","items":{"type":"string"}}}}],"example":{"id":504,"public_id":"ExPrt1","community_id":1,"target_all":true,"target_ids":[],"failed_ids":[],"target_count":150,"performed_count":150,"started_at":"2025-01-01T00:01:00.000Z","completed_at":"2025-01-01T00:01:30.000Z","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:01:30.000Z","status":"completed","fields":["name","email","joined_at"]},"required":["community_id","completed_at","created_at","failed_ids","fields","id","performed_count","public_id","started_at","status","target_all","target_count","target_ids","updated_at"]},"CommunitiesMembershipsExportActionParameters":{"type":"object","title":"Communities::Memberships::ExportAction","description":"Communities::Memberships::ExportAction","properties":{"target_all":{"type":"boolean","description":"When true, export all members in the community (target_ids is ignored)"},"target_ids":{"type":"array","description":"Array of membership public IDs to export. Required when target_all is false.","items":{"type":"string"}},"fields":{"type":"array","description":"Array of column names to include in the export","items":{"type":"string"}}},"example":{"communities_memberships_export_action":{"target_all":true,"target_ids":[],"fields":["name","email","joined_at"]}}},"CommunitiesBansUnbanActionAttributes":{"type":"object","title":"Communities::Bans::UnbanAction","description":"Communities::Bans::UnbanAction","allOf":[{"$ref":"#/components/schemas/CommunitiesActionAttributes"}],"example":{"id":505,"public_id":"UnBn01","community_id":1,"target_all":false,"target_ids":[201,202],"failed_ids":[],"target_count":2,"performed_count":2,"started_at":"2025-01-01T00:01:00.000Z","completed_at":"2025-01-01T00:01:05.000Z","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:01:05.000Z","status":"completed"},"required":["community_id","completed_at","created_at","failed_ids","id","performed_count","public_id","started_at","status","target_all","target_count","target_ids","updated_at"]},"CommunitiesBansUnbanActionParameters":{"type":"object","title":"Communities::Bans::UnbanAction","description":"Communities::Bans::UnbanAction","properties":{"target_all":{"type":"boolean","description":"When true, unban all banned contacts in the community (target_ids is ignored)"},"target_ids":{"type":"array","description":"Array of ban public IDs to unban. Required when target_all is false.","items":{"type":"string"}}},"example":{"communities_bans_unban_action":{"target_all":false,"target_ids":["MnOpQr","StUvWx"]}}},"CommunitiesBansExportActionAttributes":{"type":"object","title":"Communities::Bans::ExportAction","description":"Communities::Bans::ExportAction","allOf":[{"$ref":"#/components/schemas/CommunitiesActionAttributes"},{"type":"object","properties":{"fields":{"type":"array","description":"Column names included in the export file","items":{"type":"string"}}}}],"example":{"id":506,"public_id":"BnExP1","community_id":1,"target_all":true,"target_ids":[],"failed_ids":[],"target_count":50,"performed_count":50,"started_at":"2025-01-01T00:01:00.000Z","completed_at":"2025-01-01T00:01:15.000Z","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:01:15.000Z","status":"completed","fields":["contact_name","contact_email","reason","created_at"]},"required":["community_id","completed_at","created_at","failed_ids","fields","id","performed_count","public_id","started_at","status","target_all","target_count","target_ids","updated_at"]},"CommunitiesBansExportActionParameters":{"type":"object","title":"Communities::Bans::ExportAction","description":"Communities::Bans::ExportAction","properties":{"target_all":{"type":"boolean","description":"When true, export all bans in the community (target_ids is ignored)"},"target_ids":{"type":"array","description":"Array of ban public IDs to export. Required when target_all is false.","items":{"type":"string"}},"fields":{"type":"array","description":"Array of column names to include in the export","items":{"type":"string"}}},"example":{"communities_bans_export_action":{"target_all":true,"target_ids":[],"fields":["contact_name","contact_email","reason","created_at"]}}},"ContactBaseAttributes":{"type":"object","title":"Contacts","description":"Contacts","properties":{"id":{"type":"integer","description":"Contact ID"},"public_id":{"type":"string","description":"Contact public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"anonymous":{"type":["integer","null"],"description":"Anonymous"},"email_address":{"type":["string","null"],"description":"The contact's email address. It is currently not expected to be null and is the main identifier for a contact."},"first_name":{"type":["string","null"],"description":"First name"},"last_name":{"type":["string","null"],"description":"Last name"},"phone_number":{"type":["string","null"],"description":"Phone number"},"time_zone":{"type":["string","null"],"description":"The human-readable time zone, usually set dynamically by the app for the contact, for example, during opt-in.\nRead more about time zones and how to map them back to the TZ standard in [our Time Zones guide.](https://dash.readme.com/project/cf2/v2/docs/timezones).\n"},"uuid":{"type":"string","description":"UUID"},"unsubscribed_at":{"type":["string","null"],"description":"Unsubscribed"},"last_notification_email_sent_at":{"type":["string","null"],"description":"Last notification email sent"},"email_suppression_reason":{"type":["string","null"],"description":"The reason the contact's email address is suppressed from receiving emails. Null when no suppression exists."},"is_active":{"type":"boolean","description":"Whether the contact is active. A contact is considered active when they have a valid email address, have not unsubscribed, have not been deleted, and have no email suppression reason."},"fb_url":{"type":["string","null"],"description":"Facebook URL"},"twitter_url":{"type":["string","null"],"description":"Twitter URL"},"instagram_url":{"type":["string","null"],"description":"Instagram URL"},"linkedin_url":{"type":["string","null"],"description":"LinkedIn URL"},"website_url":{"type":["string","null"],"description":"Website URL"},"created_at":{"type":"string","format":"date-time","description":"Date added"},"updated_at":{"type":"string","format":"date-time","description":"Last updated"},"tags":{"type":["array","null"],"items":{"type":"object","title":"Contact Tags","description":"Contact Tags","properties":{"id":{"type":"integer","description":"Tag ID"},"public_id":{"type":"string","description":"Tag public ID"},"name":{"type":"string","description":"Name"},"color":{"type":"string","description":"Color"},"applied_at":{"type":["string","null"],"description":"The datetime the tag was applied by creating a Contacts::AppliedTag that maps the tag to the contact."}}},"description":"Contact Tags"},"custom_attributes":{"type":"object","additionalProperties":{"type":"string"},"description":"A dynamic key-value pair object where both the key and value are strings. Custom attributes are usually added to the contact when they submit forms that contain custom contact attributes. But you can also add them via the API using the modifying endpoints like Create/Update/Upsert Contact."},"visits":{"allOf":[{"$ref":"#/components/schemas/VisitsAttributes"}],"description":"Visit tracking information for this contact, including first visit, last visit, and last visit with UTM parameters"}},"example":{"id":24359,"public_id":"vQxYMj","workspace_id":4,"anonymous":0,"email_address":"jane.doe@example.com","first_name":"Jane","last_name":"Doe","phone_number":"+18005550199","time_zone":"Madrid","uuid":"80b7f903-76cd-4edf-94bf-fc34c13ee654","unsubscribed_at":null,"last_notification_email_sent_at":null,"email_suppression_reason":null,"is_active":true,"fb_url":null,"twitter_url":null,"instagram_url":null,"linkedin_url":null,"website_url":null,"created_at":"2026-01-09T15:27:56.647Z","updated_at":"2026-01-09T15:28:08.075Z","tags":[],"custom_attributes":{},"visits":{"first_visit":{"uuid":"9f2e8a22-1b65-4414-95f3-5caf0bbd11da","utm_source":"google","utm_medium":"cpc","utm_campaign":"spring_sale","utm_term":"running shoes","utm_content":"ad_variant_a","ip":"192.168.1.1","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36","referrer":"https://www.google.com/search?q=example","referring_domain":"google.com","landing_page":"https://example.com/products/shoes","browser":"Chrome","os":"Mac OS X","device_type":"desktop","started_at":"2026-01-09T14:23:45.123Z","created_at":"2026-01-09T14:23:45.123Z","updated_at":"2026-01-09T14:23:45.123Z"},"last_visit":null,"last_visit_with_utm":{"uuid":"9f2e8a22-1b65-4414-95f3-5caf0bbd11da","utm_source":"google","utm_medium":"cpc","utm_campaign":"spring_sale","utm_term":"running shoes","utm_content":"ad_variant_a","ip":"192.168.1.1","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36","referrer":"https://www.google.com/search?q=example","referring_domain":"google.com","landing_page":"https://example.com/products/shoes","browser":"Chrome","os":"Mac OS X","device_type":"desktop","started_at":"2026-01-09T14:23:45.123Z","created_at":"2026-01-09T14:23:45.123Z","updated_at":"2026-01-09T14:23:45.123Z"}}},"required":["anonymous","created_at","custom_attributes","email_address","email_suppression_reason","fb_url","first_name","id","instagram_url","is_active","last_name","last_notification_email_sent_at","linkedin_url","phone_number","public_id","tags","time_zone","twitter_url","unsubscribed_at","updated_at","uuid","visits","website_url","workspace_id"]},"ContactAttributes":{"allOf":[{"$ref":"#/components/schemas/ContactBaseAttributes"}],"type":"object","title":"Contacts","description":"Contacts","properties":{"email_engagement":{"type":"object","description":"**Expandable** Email engagement timestamps. Only included when `expand[]=email_engagement` is passed. See the [Expanding guide](https://developers.myclickfunnels.com/docs/expand) for details.","properties":{"last_email_sent_at":{"type":["string","null"],"format":"date-time","description":"The datetime of the last email sent to this contact."},"last_email_opened_at":{"type":["string","null"],"format":"date-time","description":"The datetime of the last email opened by this contact."},"last_email_clicked_at":{"type":["string","null"],"format":"date-time","description":"The datetime of the last email link clicked by this contact."}}}},"example":{"id":24359,"public_id":"vQxYMj","workspace_id":4,"anonymous":0,"email_address":"jane.doe@example.com","first_name":"Jane","last_name":"Doe","phone_number":"+18005550199","time_zone":"Madrid","uuid":"80b7f903-76cd-4edf-94bf-fc34c13ee654","unsubscribed_at":null,"last_notification_email_sent_at":null,"email_suppression_reason":null,"is_active":true,"fb_url":null,"twitter_url":null,"instagram_url":null,"linkedin_url":null,"website_url":null,"created_at":"2026-01-09T15:27:56.647Z","updated_at":"2026-01-09T15:28:08.075Z","tags":[],"custom_attributes":{},"visits":{"first_visit":{"uuid":"9f2e8a22-1b65-4414-95f3-5caf0bbd11da","utm_source":"google","utm_medium":"cpc","utm_campaign":"spring_sale","utm_term":"running shoes","utm_content":"ad_variant_a","ip":"192.168.1.1","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36","referrer":"https://www.google.com/search?q=example","referring_domain":"google.com","landing_page":"https://example.com/products/shoes","browser":"Chrome","os":"Mac OS X","device_type":"desktop","started_at":"2026-01-09T14:23:45.123Z","created_at":"2026-01-09T14:23:45.123Z","updated_at":"2026-01-09T14:23:45.123Z"},"last_visit":null,"last_visit_with_utm":{"uuid":"9f2e8a22-1b65-4414-95f3-5caf0bbd11da","utm_source":"google","utm_medium":"cpc","utm_campaign":"spring_sale","utm_term":"running shoes","utm_content":"ad_variant_a","ip":"192.168.1.1","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36","referrer":"https://www.google.com/search?q=example","referring_domain":"google.com","landing_page":"https://example.com/products/shoes","browser":"Chrome","os":"Mac OS X","device_type":"desktop","started_at":"2026-01-09T14:23:45.123Z","created_at":"2026-01-09T14:23:45.123Z","updated_at":"2026-01-09T14:23:45.123Z"}}},"required":["anonymous","created_at","custom_attributes","email_address","email_suppression_reason","fb_url","first_name","id","instagram_url","is_active","last_name","last_notification_email_sent_at","linkedin_url","phone_number","public_id","tags","time_zone","twitter_url","unsubscribed_at","updated_at","uuid","visits","website_url","workspace_id"]},"ContactShortAttributes":{"type":"object","title":"Contact (Short)","description":"A compact contact representation used in nested resources.","properties":{"id":{"type":"integer","description":"The ID of the contact."},"public_id":{"type":"string","description":"The public ID of the contact."},"email_address":{"type":"string","description":"The email address of the contact."},"first_name":{"type":["string","null"],"description":"The first name of the contact."},"last_name":{"type":["string","null"],"description":"The last name of the contact."},"phone_number":{"type":["string","null"],"description":"The phone number of the contact."}},"example":{"id":24359,"public_id":"vQxYMj","email_address":"jane.doe@example.com","first_name":"Jane","last_name":"Doe","phone_number":"+18005550199"},"required":["email_address","first_name","id","last_name","phone_number","public_id"]},"ContactParameters":{"type":"object","title":"Contacts","description":"Contacts","required":[],"properties":{"email_address":{"type":["string","null"],"description":"Email address"},"first_name":{"type":["string","null"],"description":"First name"},"last_name":{"type":["string","null"],"description":"Last name"},"phone_number":{"type":["string","null"],"description":"Phone number"},"time_zone":{"type":["string","null"],"description":"The human-readable time zone, usually set dynamically by the app for the contact, for example, during opt-in.\nRead more about time zones and how to map them back to the TZ standard in [our Time Zones guide.](https://dash.readme.com/project/cf2/v2/docs/timezones).\n"},"fb_url":{"type":["string","null"],"description":"Facebook URL"},"twitter_url":{"type":["string","null"],"description":"Twitter URL"},"instagram_url":{"type":["string","null"],"description":"Instagram URL"},"linkedin_url":{"type":["string","null"],"description":"LinkedIn URL"},"website_url":{"type":["string","null"],"description":"Website URL"},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"Contact Tag IDs. Any valid array, empty or with valid tags will overwrite existing values. To avoid losing existing tags first use the Fetch Contact endpoint, then be sure to include the existing tags in your payload along with any new addition(s)."},"custom_attributes":{"type":"object","additionalProperties":{"type":"string"},"description":"Custom attributes are usually added in ClickFunnels to a contact when they submit forms that contain custom contact attributes. Here you can directly create them during contact modification.\n\nCustom attributes are provided as key-value pairs:\nA key that does not exist, will create a new custom contact attribute.\nA key that already exists, will update the value of an existing custom contact attribute.\n\nEmpty or null values, will set the custom attribute values to empty strings. A key that has special characters or spaces will be automatically converted to `snake_case` (For example, 'Favorite Food! 🥑' will be converted to 'favorite_food').\n\nEmpty keys will trigger a bad request response. Also, non-object inputs for custom_attributes (e.g. an array or string), it will be ignored.\nKeys that are default properties on the Contact resource or variations of it will result in an error. E.g., 'first_name', 'First Name', etc. are not valid inputs.\n"}},"example":{"contact":{"email_address":"test-4059727ec8e173ce4648@example.com","first_name":"Sol","last_name":"Jones","phone_number":"(224) 508-1342 x59891","time_zone":"Pacific Time (US & Canada)","fb_url":"https://www.facebook.com/example","twitter_url":"https://twitter.com/example","instagram_url":null,"linkedin_url":"https://www.linkedin.com/in/example","website_url":"https://example.com"}}},"ContactParametersUpdate":{"type":"object","title":"Contacts","description":"Contacts","required":[],"properties":{"email_address":{"type":["string","null"],"description":"Email address"},"first_name":{"type":["string","null"],"description":"First name"},"last_name":{"type":["string","null"],"description":"Last name"},"phone_number":{"type":["string","null"],"description":"Phone number"},"time_zone":{"type":["string","null"],"description":"The human-readable time zone, usually set dynamically by the app for the contact, for example, during opt-in.\nRead more about time zones and how to map them back to the TZ standard in [our Time Zones guide.](https://dash.readme.com/project/cf2/v2/docs/timezones).\n"},"fb_url":{"type":["string","null"],"description":"Facebook URL"},"twitter_url":{"type":["string","null"],"description":"Twitter URL"},"instagram_url":{"type":["string","null"],"description":"Instagram URL"},"linkedin_url":{"type":["string","null"],"description":"LinkedIn URL"},"website_url":{"type":["string","null"],"description":"Website URL"},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"Contact Tag IDs. Any valid array, empty or with valid tags will overwrite existing values. To avoid losing existing tags first use the Fetch Contact endpoint, then be sure to include the existing tags in your payload along with any new addition(s)."},"custom_attributes":{"type":"object","additionalProperties":{"type":"string"},"description":"Custom attributes are usually added in ClickFunnels to a contact when they submit forms that contain custom contact attributes. Here you can directly create them during contact modification.\n\nCustom attributes are provided as key-value pairs:\nA key that does not exist, will create a new custom contact attribute.\nA key that already exists, will update the value of an existing custom contact attribute.\n\nEmpty or null values, will set the custom attribute values to empty strings. A key that has special characters or spaces will be automatically converted to `snake_case` (For example, 'Favorite Food! 🥑' will be converted to 'favorite_food').\n\nEmpty keys will trigger a bad request response. Also, non-object inputs for custom_attributes (e.g. an array or string), it will be ignored.\nKeys that are default properties on the Contact resource or variations of it will result in an error. E.g., 'first_name', 'First Name', etc. are not valid inputs.\n"}},"example":{"contact":{"email_address":"test-4059727ec8e173ce4648@example.com","first_name":"Sol","last_name":"Jones","phone_number":"(224) 508-1342 x59891","time_zone":"Pacific Time (US & Canada)","fb_url":"https://www.facebook.com/example","twitter_url":"https://twitter.com/example","instagram_url":null,"linkedin_url":"https://www.linkedin.com/in/example","website_url":"https://example.com"}}},"ContactsAppliedTagAttributes":{"type":"object","title":"Contacts Applied Tags","description":"Contacts Applied Tags","properties":{"id":{"type":"integer","description":"Applied Tag ID"},"public_id":{"type":["string","null"],"description":"Applied Tag public ID"},"contact_id":{"type":"integer","description":"Contact ID"},"tag_id":{"type":"integer","description":"Tag ID"},"created_at":{"type":["string","null"],"format":"date-time","description":"Date added"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Last updated"},"tag":{"type":"object","title":"Contact Tags","description":"Contact Tags","properties":{"public_id":{"type":["string","null"],"description":"Tag public ID"},"name":{"type":"string","description":"Name"},"color":{"type":"string","description":"Color"}}},"contact":{"$ref":"#/components/schemas/ContactShortAttributes"}},"example":{"id":1,"public_id":"PYfeiE","contact_id":1,"tag_id":3,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","tag":{"public_id":"KekAvg","name":"Example Tag","color":"#00FF00"},"contact":{"id":24359,"public_id":"vQxYMj","email_address":"jane.doe@example.com","first_name":"Jane","last_name":"Doe","phone_number":"+18005550199"}},"required":["contact","contact_id","created_at","id","public_id","tag","tag_id","updated_at"]},"ContactsAppliedTagParameters":{"type":"object","title":"Contacts Applied Tags","description":"Contacts Applied Tags","required":["tag_id"],"properties":{"tag_id":{"type":"integer","description":"Tag ID"}},"example":{"contacts_applied_tag":{"tag_id":3}}},"ContactsAppliedTagParametersUpdate":{"type":"object","title":"Contacts Applied Tags","description":"Contacts Applied Tags","required":["tag_id"],"properties":{"tag_id":{"type":"integer","description":"Tag ID"}},"example":{"contacts_applied_tag":{"tag_id":3}}},"ContactsTagAttributes":{"type":"object","title":"Contact Tags","description":"Contact Tags","properties":{"id":{"type":"integer","description":"Tag ID"},"public_id":{"type":["string","null"],"description":"Tag public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"name":{"type":"string","description":"Name"},"color":{"type":"string","description":"Color"},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at datetime"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at datetime"}},"example":{"id":4,"public_id":"LutgGM","workspace_id":42000,"name":"Example Tag","color":"#00FF00","created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["color","created_at","id","name","public_id","updated_at","workspace_id"]},"ContactsTagParameters":{"type":"object","title":"Contact Tags","description":"Contact Tags","required":["name"],"properties":{"name":{"type":"string","description":"Name"},"color":{"type":"string","description":"Tag Color"}},"example":{"contacts_tag":{"name":"Example Tag","color":"#FF5733"}}},"ContactsTagParametersUpdate":{"type":"object","title":"Contact Tags","description":"Contact Tags","required":[],"properties":{"name":{"type":"string","description":"Tag Name"},"color":{"type":"string","description":"Tag Color"}},"example":{"contacts_tag":{"name":"renamed-tag","color":"#FF5733"}}},"ContactsTagActionAttributes":{"type":"object","title":"Contacts Tag Actions","description":"Bulk tag-apply or tag-remove action targeting a collection of contacts","properties":{"id":{"type":"integer","description":"Tag Action ID"},"public_id":{"type":["string","null"],"description":"Tag Action public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"The raw integer IDs of the tags applied or removed by this action. The response echoes the stored integer tag IDs, not the public IDs passed on create."},"action_type":{"type":"string","description":"Whether to apply or remove the tags. `\"add\"` (default) tags matching contacts; `\"remove\"` untags them.","enum":["add","remove"]},"filter_id":{"type":["integer","null"],"description":"ID of the `Refine::StoredFilter` that drives target selection. Populated automatically when `stable_id` or `stored_filter_id` is supplied on create. `null` when the action targets explicit `target_ids` or `target_all`."},"target_all":{"type":["boolean","null"],"description":"When `true` the action targets every contact in the workspace. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_ids`."},"target_ids":{"type":["array","null"],"items":{"type":"integer"},"description":"Explicit list of targeted contacts as raw integer IDs. The response echoes the stored integer IDs, not the public IDs passed on create."},"target_count":{"type":["integer","null"],"description":"Total number of contacts selected for this action. `null` until the async job has resolved the audience size."},"performed_count":{"type":["integer","null"],"description":"Number of contacts processed so far. Poll this field alongside `target_count` to track async progress."},"created_by_id":{"type":["integer","null"],"description":"ID of the workspace membership that created this action."},"approved_by_id":{"type":["integer","null"],"description":"ID of the membership that approved this action (reserved for future use)."},"scheduled_for":{"type":["string","null"],"format":"date-time","description":"When set, the action will not execute until this datetime. `null` means execute immediately."},"started_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job began processing contacts. `null` until started."},"completed_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job finished. `null` until complete."},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at datetime"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at datetime"}},"example":{"id":1,"public_id":"aB3cD4","workspace_id":42000,"tag_ids":[12,34],"action_type":"add","filter_id":7,"target_all":false,"target_ids":[],"target_count":850,"performed_count":200,"created_by_id":5,"approved_by_id":null,"scheduled_for":null,"started_at":"2025-01-01T00:01:00.000Z","completed_at":null,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:01:00.000Z"},"required":["action_type","approved_by_id","completed_at","created_at","created_by_id","filter_id","id","performed_count","public_id","scheduled_for","started_at","tag_ids","target_all","target_count","target_ids","updated_at","workspace_id"]},"ContactsTagActionParameters":{"type":"object","title":"Contacts Tag Actions","description":"Contacts Tag Actions","required":["tag_ids"],"properties":{"tag_ids":{"type":"array","items":{"type":"string"},"description":"One or more tag `public_id` strings identifying existing tags to apply or remove. Every id must reference a tag that already exists in this workspace; unknown ids are rejected with a 422 (tags are not auto-created)."},"action_type":{"type":"string","description":"`\"add\"` (default) applies the tags; `\"remove\"` removes them.","enum":["add","remove"]},"stable_id":{"type":"string","description":"A URL-encoded Refine `stable_id` token — the standard gzip+base64 full-state format used by both the `contacts/filters` API endpoint and the server-rendered filter UI, making tokens interoperable. Returned by `POST /api/v2/workspaces/{workspace_id}/contacts/filters` in the `stable_id` field. 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. Mutually exclusive with `stored_filter_id`, `target_ids`, and `target_all`."},"stored_filter_id":{"type":"string","description":"The `id` (integer) or `public_id` (string) of a saved `Refine::StoredFilter` scoped to this workspace (must be a ContactsFilter). Also accepted as `filter_id`. Mutually exclusive with `stable_id`, `target_ids`, and `target_all`."},"target_ids":{"type":"array","items":{"type":"string"},"description":"Explicit list of contacts to tag/untag, as the `public_id` strings returned by the contacts endpoints (e.g. `\"aB3cD4\"`) — the same id format used everywhere else in this API. Numeric ids are also accepted. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_all`."},"target_all":{"type":"boolean","description":"Set to `true` to target every contact in the workspace. Use deliberately. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_ids`."},"scheduled_for":{"type":"string","format":"date-time","description":"Optional ISO 8601 datetime. When supplied the action is deferred until this time. Omit (or pass `null`) to execute immediately."}},"example":{"contacts_tag_action":{"tag_ids":["12","34"],"action_type":"add","stored_filter_id":"7"}}},"ContactsEnrollActionAttributes":{"type":"object","title":"Contacts Enroll Actions","description":"Bulk course-enrollment action targeting a collection of contacts","properties":{"id":{"type":"integer","description":"Enroll Action ID"},"public_id":{"type":["string","null"],"description":"Enroll Action public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"course_ids":{"type":["array","null"],"items":{"type":"integer"},"description":"The raw integer IDs of the courses contacts were enrolled into. The response echoes stored integer IDs, not the public IDs passed on create."},"section_ids":{"type":["array","null"],"items":{"type":"integer"},"description":"The raw integer IDs of the course sections contacts were enrolled into. The response echoes stored integer IDs, not the public IDs passed on create."},"filter_id":{"type":["integer","null"],"description":"ID of the `Refine::StoredFilter` that drives target selection. Populated automatically when `stable_id` or `stored_filter_id` is supplied on create. `null` when the action targets explicit `target_ids` or `target_all`."},"target_all":{"type":["boolean","null"],"description":"When `true` the action targets every contact in the workspace. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_ids`."},"target_ids":{"type":["array","null"],"items":{"type":"integer"},"description":"Explicit list of targeted contacts as raw integer IDs. The response echoes the stored integer IDs, not the public IDs passed on create."},"target_count":{"type":["integer","null"],"description":"Total number of contacts selected for this action. `null` until the async job has resolved the audience size."},"performed_count":{"type":["integer","null"],"description":"Number of contacts processed so far. Poll this field alongside `target_count` to track async progress."},"created_by_id":{"type":["integer","null"],"description":"ID of the workspace membership that created this action."},"scheduled_for":{"type":["string","null"],"format":"date-time","description":"When set, the action will not execute until this datetime. `null` means execute immediately."},"started_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job began processing contacts. `null` until started."},"completed_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job finished. `null` until complete."},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at datetime"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at datetime"}},"example":{"id":1,"public_id":"aB3cD4","workspace_id":42000,"course_ids":[4],"section_ids":[8],"filter_id":7,"target_all":false,"target_ids":[],"target_count":200,"performed_count":50,"created_by_id":5,"scheduled_for":null,"started_at":"2025-01-01T00:01:00.000Z","completed_at":null,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:01:00.000Z"},"required":["completed_at","course_ids","created_at","created_by_id","filter_id","id","performed_count","public_id","scheduled_for","section_ids","started_at","target_all","target_count","target_ids","updated_at","workspace_id"]},"ContactsEnrollActionParameters":{"type":"object","title":"Contacts Enroll Actions","description":"Contacts Enroll Actions","properties":{"course_ids":{"type":"array","items":{"type":"string"},"description":"Public IDs of the courses to enroll contacts into. Contacts are enrolled into every section of each course. Provide `course_ids`, `section_ids`, or both."},"section_ids":{"type":"array","items":{"type":"string"},"description":"Public IDs of specific course sections to enroll contacts into. Use when you want finer-grained control than `course_ids`."},"stable_id":{"type":"string","description":"A URL-encoded Refine `stable_id` token — the standard gzip+base64 full-state format used by both the `contacts/filters` API endpoint and the server-rendered filter UI, making tokens interoperable. Returned by `POST /api/v2/workspaces/{workspace_id}/contacts/filters` in the `stable_id` field. 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. Mutually exclusive with `stored_filter_id`, `target_ids`, and `target_all`."},"stored_filter_id":{"type":"string","description":"The `id` (integer) or `public_id` (string) of a saved `Refine::StoredFilter` scoped to this workspace (must be a ContactsFilter). Also accepted as `filter_id`. Mutually exclusive with `stable_id`, `target_ids`, and `target_all`."},"target_ids":{"type":"array","items":{"type":"string"},"description":"Explicit list of contacts to enroll, as the `public_id` strings returned by the contacts endpoints. Numeric ids are also accepted. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_all`."},"target_all":{"type":"boolean","description":"Set to `true` to target every contact in the workspace. Use deliberately. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_ids`."},"scheduled_for":{"type":"string","format":"date-time","description":"Optional ISO 8601 datetime. When supplied the action is deferred until this time. Omit (or pass `null`) to execute immediately."}},"example":{"contacts_enroll_action":{"course_ids":["QwdWoj"],"stored_filter_id":"7"}}},"ContactsRunWorkflowActionAttributes":{"type":"object","title":"Contacts Run Workflow Actions","description":"Bulk workflow-trigger action targeting a collection of contacts","properties":{"id":{"type":"integer","description":"Run Workflow Action ID"},"public_id":{"type":["string","null"],"description":"Run Workflow Action public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"workflow_id":{"type":"integer","description":"ID of the workflow to run against the targeted contacts."},"force_run":{"type":["boolean","null"],"description":"When `true`, contacts already in the workflow are re-enqueued. Defaults to `false`."},"filter_id":{"type":["integer","null"],"description":"ID of the `Refine::StoredFilter` that drives target selection. Populated automatically when `stable_id` or `stored_filter_id` is supplied on create. `null` when the action targets explicit `target_ids` or `target_all`."},"target_all":{"type":["boolean","null"],"description":"When `true` the action targets every contact in the workspace. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_ids`."},"target_ids":{"type":["array","null"],"items":{"type":"integer"},"description":"Explicit list of targeted contacts as raw integer IDs. The response echoes the stored integer IDs, not the public IDs passed on create."},"target_count":{"type":["integer","null"],"description":"Total number of contacts selected for this action. `null` until the async job has resolved the audience size."},"performed_count":{"type":["integer","null"],"description":"Number of contacts processed so far. Poll this field alongside `target_count` to track async progress."},"created_by_id":{"type":["integer","null"],"description":"ID of the workspace membership that created this action."},"approved_by_id":{"type":["integer","null"],"description":"ID of the membership that approved this action (reserved for future use)."},"scheduled_for":{"type":["string","null"],"format":"date-time","description":"When set, the action will not execute until this datetime. `null` means execute immediately."},"started_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job began processing contacts. `null` until started."},"completed_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job finished. `null` until complete."},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at datetime"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at datetime"}},"example":{"id":1,"public_id":"bC4dE5","workspace_id":42000,"workflow_id":99,"force_run":false,"filter_id":7,"target_all":false,"target_ids":[],"target_count":500,"performed_count":100,"created_by_id":5,"approved_by_id":null,"scheduled_for":null,"started_at":"2025-01-01T00:01:00.000Z","completed_at":null,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:01:00.000Z"},"required":["approved_by_id","completed_at","created_at","created_by_id","filter_id","force_run","id","performed_count","public_id","scheduled_for","started_at","target_all","target_count","target_ids","updated_at","workflow_id","workspace_id"]},"ContactsRunWorkflowActionParameters":{"type":"object","title":"Contacts Run Workflow Actions","description":"Contacts Run Workflow Actions","required":["workflow_id"],"properties":{"workflow_id":{"type":"string","description":"The `public_id` of the workflow to run against the targeted contacts. Required."},"force_run":{"type":"boolean","description":"When `true`, contacts already enrolled in the workflow are re-enqueued. Defaults to `false`."},"stable_id":{"type":"string","description":"A URL-encoded Refine `stable_id` token — the standard gzip+base64 full-state format used by both the `contacts/filters` API endpoint and the server-rendered filter UI, making tokens interoperable. Returned by `POST /api/v2/workspaces/{workspace_id}/contacts/filters` in the `stable_id` field. 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. Mutually exclusive with `stored_filter_id`, `target_ids`, and `target_all`."},"stored_filter_id":{"type":"string","description":"The `id` (integer) or `public_id` (string) of a saved `Refine::StoredFilter` scoped to this workspace (must be a ContactsFilter). Also accepted as `filter_id`. Mutually exclusive with `stable_id`, `target_ids`, and `target_all`."},"target_ids":{"type":"array","items":{"type":"string"},"description":"Explicit list of contacts to run the workflow against, as the `public_id` strings returned by the contacts endpoints. Numeric ids are also accepted. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_all`."},"target_all":{"type":"boolean","description":"Set to `true` to target every contact in the workspace. Use deliberately. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_ids`."},"scheduled_for":{"type":"string","format":"date-time","description":"Optional ISO 8601 datetime. When supplied the action is deferred until this time. Omit (or pass `null`) to execute immediately."}},"example":{"contacts_run_workflow_action":{"workflow_id":"Wf1aB2","stored_filter_id":"7"}}},"ContactsUnsubscribeActionAttributes":{"type":"object","title":"Contacts Unsubscribe Actions","description":"Bulk email-unsubscribe action targeting a collection of contacts","properties":{"id":{"type":"integer","description":"Unsubscribe Action ID"},"public_id":{"type":["string","null"],"description":"Unsubscribe Action public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"filter_id":{"type":["integer","null"],"description":"ID of the `Refine::StoredFilter` that drives target selection. Populated automatically when `stable_id` or `stored_filter_id` is supplied on create. `null` when the action targets explicit `target_ids` or `target_all`."},"target_all":{"type":["boolean","null"],"description":"When `true` the action targets every contact in the workspace. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_ids`."},"target_ids":{"type":["array","null"],"items":{"type":"integer"},"description":"Explicit list of targeted contacts as raw integer IDs. The response echoes the stored integer IDs, not the public IDs passed on create."},"target_count":{"type":["integer","null"],"description":"Total number of contacts selected for this action. `null` until the async job has resolved the audience size."},"performed_count":{"type":["integer","null"],"description":"Number of contacts processed so far. Poll this field alongside `target_count` to track async progress."},"created_by_id":{"type":["integer","null"],"description":"ID of the workspace membership that created this action."},"approved_by_id":{"type":["integer","null"],"description":"ID of the membership that approved this action (reserved for future use)."},"scheduled_for":{"type":["string","null"],"format":"date-time","description":"When set, the action will not execute until this datetime. `null` means execute immediately."},"started_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job began processing contacts. `null` until started."},"completed_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job finished. `null` until complete."},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at datetime"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at datetime"}},"example":{"id":1,"public_id":"cD5eF6","workspace_id":42000,"filter_id":7,"target_all":false,"target_ids":[],"target_count":300,"performed_count":0,"created_by_id":5,"approved_by_id":null,"scheduled_for":null,"started_at":null,"completed_at":null,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["approved_by_id","completed_at","created_at","created_by_id","filter_id","id","performed_count","public_id","scheduled_for","started_at","target_all","target_count","target_ids","updated_at","workspace_id"]},"ContactsUnsubscribeActionParameters":{"type":"object","title":"Contacts Unsubscribe Actions","description":"Contacts Unsubscribe Actions","properties":{"stable_id":{"type":"string","description":"A URL-encoded Refine `stable_id` token — the standard gzip+base64 full-state format used by both the `contacts/filters` API endpoint and the server-rendered filter UI, making tokens interoperable. Returned by `POST /api/v2/workspaces/{workspace_id}/contacts/filters` in the `stable_id` field. 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. Mutually exclusive with `stored_filter_id`, `target_ids`, and `target_all`."},"stored_filter_id":{"type":"string","description":"The `id` (integer) or `public_id` (string) of a saved `Refine::StoredFilter` scoped to this workspace (must be a ContactsFilter). Also accepted as `filter_id`. Mutually exclusive with `stable_id`, `target_ids`, and `target_all`."},"target_ids":{"type":"array","items":{"type":"string"},"description":"Explicit list of contacts to unsubscribe, as the `public_id` strings returned by the contacts endpoints. Numeric ids are also accepted. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_all`."},"target_all":{"type":"boolean","description":"Set to `true` to target every contact in the workspace. Use deliberately. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_ids`."},"scheduled_for":{"type":"string","format":"date-time","description":"Optional ISO 8601 datetime. When supplied the action is deferred until this time. Omit (or pass `null`) to execute immediately."}},"example":{"contacts_unsubscribe_action":{"stored_filter_id":"7"}}},"ContactsExportActionAttributes":{"type":"object","title":"Contacts Export Actions","description":"Bulk CSV-export action targeting a collection of contacts","properties":{"id":{"type":"integer","description":"Export Action ID"},"public_id":{"type":["string","null"],"description":"Export Action public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"fields":{"type":["array","null"],"items":{"type":"string"},"description":"The contact field keys to include as columns in the exported CSV (e.g. `[\"email_address\", \"first_name\", \"tag_ids\"]`). Custom attribute keys are also accepted."},"file_url":{"type":["string","null"],"description":"Download URL for the generated CSV file. `null` until the async export job completes."},"filter_id":{"type":["integer","null"],"description":"ID of the `Refine::StoredFilter` that drives target selection. Populated automatically when `stable_id` or `stored_filter_id` is supplied on create. `null` when the action targets explicit `target_ids` or `target_all`."},"target_all":{"type":["boolean","null"],"description":"When `true` the action targets every contact in the workspace. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_ids`."},"target_ids":{"type":["array","null"],"items":{"type":"integer"},"description":"Explicit list of targeted contacts as raw integer IDs. The response echoes the stored integer IDs, not the public IDs passed on create."},"target_count":{"type":["integer","null"],"description":"Total number of contacts selected for this action. `null` until the async job has resolved the audience size."},"performed_count":{"type":["integer","null"],"description":"Number of contacts processed so far. Poll this field alongside `target_count` to track async progress."},"created_by_id":{"type":["integer","null"],"description":"ID of the workspace membership that created this action."},"approved_by_id":{"type":["integer","null"],"description":"ID of the membership that approved this action (reserved for future use)."},"scheduled_for":{"type":["string","null"],"format":"date-time","description":"When set, the action will not execute until this datetime. `null` means execute immediately."},"started_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job began processing contacts. `null` until started."},"completed_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job finished. `null` until complete."},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at datetime"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at datetime"}},"example":{"id":1,"public_id":"dE6fG7","workspace_id":42000,"fields":["email_address","first_name","tag_ids"],"file_url":null,"filter_id":7,"target_all":false,"target_ids":[],"target_count":1500,"performed_count":0,"created_by_id":5,"approved_by_id":null,"scheduled_for":null,"started_at":null,"completed_at":null,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["approved_by_id","completed_at","created_at","created_by_id","fields","file_url","filter_id","id","performed_count","public_id","scheduled_for","started_at","target_all","target_count","target_ids","updated_at","workspace_id"]},"ContactsExportActionParameters":{"type":"object","title":"Contacts Export Actions","description":"Contacts Export Actions","required":["fields"],"properties":{"fields":{"type":"array","items":{"type":"string"},"description":"The contact field keys to include as columns in the exported CSV. Standard keys include `email_address`, `first_name`, `last_name`, `tag_ids`, `phone_number`, etc. Custom attribute keys are also accepted. Required."},"stable_id":{"type":"string","description":"A URL-encoded Refine `stable_id` token — the standard gzip+base64 full-state format used by both the `contacts/filters` API endpoint and the server-rendered filter UI, making tokens interoperable. Returned by `POST /api/v2/workspaces/{workspace_id}/contacts/filters` in the `stable_id` field. 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. Mutually exclusive with `stored_filter_id`, `target_ids`, and `target_all`."},"stored_filter_id":{"type":"string","description":"The `id` (integer) or `public_id` (string) of a saved `Refine::StoredFilter` scoped to this workspace (must be a ContactsFilter). Also accepted as `filter_id`. Mutually exclusive with `stable_id`, `target_ids`, and `target_all`."},"target_ids":{"type":"array","items":{"type":"string"},"description":"Explicit list of contacts to export, as the `public_id` strings returned by the contacts endpoints. Numeric ids are also accepted. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_all`."},"target_all":{"type":"boolean","description":"Set to `true` to target every contact in the workspace. Use deliberately. Mutually exclusive with `stable_id`, `stored_filter_id`, and `target_ids`."},"scheduled_for":{"type":"string","format":"date-time","description":"Optional ISO 8601 datetime. When supplied the action is deferred until this time. Omit (or pass `null`) to execute immediately."}},"example":{"contacts_export_action":{"fields":["email_address","first_name","tag_ids"],"stored_filter_id":"7"}}},"CourseAttributes":{"type":"object","title":"Courses","description":"Courses","properties":{"id":{"type":"integer","description":"Course ID"},"public_id":{"type":["string","null"],"description":"Course public ID"},"title":{"type":"string","description":"Title"},"published_at":{"type":["string","null"],"format":"date-time","description":"Available at"},"root_section_id":{"type":["string","null"],"description":"Root section. Auto-created with the course and the implicit parent of every top-level module. See [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)."},"description":{"type":"string","description":"Description"},"current_path":{"type":["string","null"],"description":"Course Path URL"},"sharing_fingerprint":{"type":["string","null"],"description":"Sharing Fingerprint"},"show_in_community":{"type":["boolean","null"],"description":"Show In Customer Center?"},"show_to_non_members":{"type":["boolean","null"],"description":"Show To Non Members"},"upgrade_url":{"type":["string","null"],"description":"Upgrade URL"},"redirect_to_full_course":{"type":["boolean","null"],"description":"Redirect To Full Course"},"unauthorized_redirect_url":{"type":["string","null"],"description":"Unauthorized Redirect"},"comments_enabled":{"type":["boolean","null"],"description":"Enable Lesson Comments?"},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at"},"image_url":{"type":["string","null"],"description":"The URL of the image that is shown on the storefront of the main course page"}},"example":{"id":1,"public_id":"iawbIp","title":"Example Course","published_at":"2025-01-01T00:00:00.000Z","root_section_id":null,"description":"A practical and engaging course designed to build core skills in Marketing.","current_path":null,"sharing_fingerprint":null,"show_in_community":false,"show_to_non_members":false,"upgrade_url":null,"redirect_to_full_course":true,"unauthorized_redirect_url":null,"comments_enabled":false,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","image_url":"https://example.myclickfunnels.com/uploads/image/1/file/9c8d1e7d480dc9882c519d4b4528826f.png"},"required":["comments_enabled","created_at","current_path","description","id","image_url","public_id","published_at","redirect_to_full_course","root_section_id","sharing_fingerprint","show_in_community","show_to_non_members","title","unauthorized_redirect_url","updated_at","upgrade_url"]},"CourseParameters":{"type":"object","title":"Courses","description":"Courses","required":["title"],"properties":{"title":{"type":"string","description":"Title"},"description":{"type":"string","description":"Description"},"show_in_community":{"type":["boolean","null"],"description":"Show In Customer Center?"},"redirect_to_full_course":{"type":["boolean","null"],"description":"Redirect To Full Course"},"image_id":{"type":["integer","null"],"description":"The ID of an Image to show on the storefront of the main course page"}},"example":{"course":{"title":"Getting Started"}}},"CourseParametersUpdate":{"type":"object","title":"Courses","description":"Courses. Updates are partial — only the attributes you include are changed; omitted attributes are left unchanged.","properties":{"title":{"type":"string","description":"Title"},"description":{"type":"string","description":"Description"},"show_in_community":{"type":["boolean","null"],"description":"Show In Customer Center?"},"redirect_to_full_course":{"type":["boolean","null"],"description":"Redirect To Full Course"},"image_id":{"type":["integer","null"],"description":"The ID of an Image to show on the storefront of the main course page"}},"example":{"course":{"title":"Example Course","description":"A practical and engaging course designed to build core skills in Marketing.","show_in_community":false,"redirect_to_full_course":true,"image_id":1}}},"CoursesEnrollmentAttributes":{"type":"object","title":"Enrollments","description":"Enrollments","properties":{"id":{"type":"integer","description":"Enrollment ID"},"public_id":{"type":["string","null"],"description":"Enrollment public ID"},"contact_id":{"type":"integer","description":"Contact ID"},"course_id":{"type":"integer","description":"Course"},"created_at":{"type":["string","null"],"format":"date-time","description":"Added"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"},"suspended":{"type":["boolean","null"],"description":"Suspended"},"suspension_reason":{"type":["string","null"],"description":"Suspension Reason"},"current_path":{"type":["string","null"],"description":"Current Path"},"origination_source_type":{"type":["string","null"],"description":"Origination Source Type"},"origination_source_id":{"type":"integer","description":"Origination Source ID"},"contact":{"$ref":"#/components/schemas/ContactShortAttributes"}},"example":{"id":1,"public_id":"kvqOCw","contact_id":3,"course_id":2,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z","suspended":false,"suspension_reason":"Call in to reapply after robot incident","current_path":"/enrollments/17cadca5ec21c9c4aede396f1e2104138b4897e43a1a974026bd0fb407556d2c65","origination_source_type":"Membership","origination_source_id":3,"contact":{"id":24359,"public_id":"vQxYMj","email_address":"jane.doe@example.com","first_name":"Jane","last_name":"Doe","phone_number":"+18005550199"}},"required":["contact","contact_id","course_id","created_at","current_path","id","origination_source_id","origination_source_type","public_id","suspended","suspension_reason","updated_at"]},"CoursesEnrollmentParameters":{"type":"object","title":"Enrollments","description":"Enrollments","required":["contact_id"],"properties":{"contact_id":{"type":"integer","description":"Contact ID"},"suspended":{"type":["boolean","null"],"description":"Suspended"},"suspension_reason":{"type":["string","null"],"description":"Suspension Reason"}},"example":{"courses_enrollment":{"contact_id":3,"suspended":false,"suspension_reason":"Call in to reapply after robot incident"}}},"CoursesEnrollmentParametersUpdate":{"type":"object","title":"Enrollments","description":"Enrollments","required":[],"properties":{"suspended":{"type":["boolean","null"],"description":"Suspended"},"suspension_reason":{"type":["string","null"],"description":"Suspension Reason"}},"example":{"courses_enrollment":{"suspended":false,"suspension_reason":"Call in to reapply after robot incident"}}},"CoursesSectionAttributes":{"type":"object","title":"Modules","description":"Modules","properties":{"id":{"type":"integer","description":"ID"},"public_id":{"type":["string","null"],"description":"Public ID"},"course_id":{"type":"integer","description":"Course ID"},"title":{"type":"string","description":"Title"},"published_at":{"type":["string","null"],"format":"date-time","description":"Published at"},"description":{"type":["string","null"],"description":"Description"},"days_till_drip_access":{"type":["integer","null"],"description":"Days until drip access"},"blocker_section_id":{"type":["integer","null"],"description":"Blocker section"},"blocker_lesson_id":{"type":["integer","null"],"description":"Blocker lesson"},"current_path":{"type":["string","null"],"description":"Current Path"},"is_hidden_from_non_members":{"type":["boolean","null"],"description":"Current Path"},"upgrade_url":{"type":["string","null"],"description":"Upgrade URL"},"parent_id":{"type":["string","null"],"description":"Parent ID is pointing to the parent section. If it's `nil` then it's the root section."},"sort_order":{"type":["integer","null"],"description":"Builder display order within the parent module. Scoped per parent, so it is not globally unique across the sections list (the root section and each parent's first child both start at 0)."},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at"}},"example":{"id":1,"public_id":"sSwcZK","course_id":3,"title":"Module 1","published_at":"2025-01-01T00:00:00.000Z","description":"Example Course Section","days_till_drip_access":5,"blocker_section_id":null,"blocker_lesson_id":null,"current_path":"/section-example","is_hidden_from_non_members":true,"upgrade_url":null,"parent_id":null,"sort_order":0,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["blocker_lesson_id","blocker_section_id","course_id","created_at","current_path","days_till_drip_access","description","id","is_hidden_from_non_members","parent_id","public_id","published_at","sort_order","title","updated_at","upgrade_url"]},"CoursesSectionParameters":{"type":"object","title":"Modules","description":"Modules","required":["title","blocker_lesson_id"],"properties":{"title":{"type":"string","description":"Title"},"description":{"type":["string","null"],"description":"Description"},"days_till_drip_access":{"type":["integer","null"],"description":"Days until drip access"},"blocker_section_id":{"type":["string","null"],"description":"Blocker section"},"blocker_lesson_id":{"type":"string","description":"Blocker lesson"},"is_hidden_from_non_members":{"type":["boolean","null"],"description":"Current Path"}},"example":{"courses_section":{"title":"Module 1","description":"Example Course Section","days_till_drip_access":5,"blocker_section_id":null,"blocker_lesson_id":null,"is_hidden_from_non_members":true}}},"CoursesSectionParametersUpdate":{"type":"object","title":"Modules","description":"Modules","required":[],"properties":{"title":{"type":"string","description":"Title"},"description":{"type":["string","null"],"description":"Description"},"days_till_drip_access":{"type":["integer","null"],"description":"Days until drip access"},"blocker_section_id":{"type":["integer","null"],"description":"Blocker section"},"blocker_lesson_id":{"type":["integer","null"],"description":"Blocker lesson"},"is_hidden_from_non_members":{"type":["boolean","null"],"description":"Current Path"}},"example":{"courses_section":{"title":"Module 1","description":"Example Course Section","days_till_drip_access":5,"blocker_section_id":123,"blocker_lesson_id":123,"is_hidden_from_non_members":true}}},"CoursesSectionsPublishActionAttributes":{"type":"object","title":"Course Section Publish Actions","description":"Asynchronous action that publishes one or more course sections and their lessons","properties":{"id":{"type":"integer","description":"Publish Action ID"},"public_id":{"type":["string","null"],"description":"Publish Action public ID"},"course_id":{"type":"integer","description":"ID of the course whose sections are being published"},"target_all":{"type":["boolean","null"],"description":"When `true`, every unpublished non-root section of the course is targeted for publishing. Mutually exclusive with `target_ids`."},"target_ids":{"type":["array","null"],"items":{"type":"integer"},"description":"Explicit list of course-section IDs targeted for publishing, always emitted as integers. The create request also accepts public IDs, which are resolved on input. Mutually exclusive with `target_all`."},"auto_enroll":{"type":["boolean","null"],"description":"When `true`, existing course enrollees are automatically granted access to the newly published sections."},"send_email":{"type":["boolean","null"],"description":"When `true` (and `auto_enroll` is also `true`), enrolled contacts receive an email notification about the newly published sections."},"offer_new_section_via_all_access_products":{"type":["boolean","null"],"description":"When `true`, products that grant full course access are updated to also offer the newly published sections."},"target_count":{"type":["integer","null"],"description":"Total number of sections targeted by this action. `null` until the async job has resolved the count."},"performed_count":{"type":["integer","null"],"description":"Number of sections processed so far. Poll alongside `target_count` to track async progress."},"published_lessons_count":{"type":["integer","null"],"description":"Number of lesson publish timestamps this action changed. Immediate actions make those lessons live, including individually scheduled lessons they force-publish; a future one-step course launch assigns its requested future timestamp instead. Lessons already live are excluded. The one-step count is recorded synchronously per section, so it reflects that flow's work rather than `0`."},"status":{"type":"string","enum":["queued","scheduled","processing","completed"],"description":"Progress of the async receipt: `queued` (saved, not yet started), `scheduled` (deferred to a future `scheduled_for`), `processing` (running), or `completed`. Poll this to tell whether work is still ongoing without inferring it from the timestamps."},"scheduled_for":{"type":["string","null"],"format":"date-time","description":"When set, the action is deferred until this datetime. Must be a future datetime. `null` means execute immediately."},"started_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job began processing sections. `null` until started."},"completed_at":{"type":["string","null"],"format":"date-time","description":"Datetime the async job finished. `null` until complete."},"created_by_id":{"type":["integer","null"],"description":"ID of the workspace membership that created this action."},"approved_by_id":{"type":["integer","null"],"description":"ID of the membership that approved this action (reserved for future use)."},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at datetime"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at datetime"}},"example":{"id":1,"public_id":"aB3cD4","course_id":5,"target_all":false,"target_ids":[8,9],"auto_enroll":true,"send_email":true,"offer_new_section_via_all_access_products":false,"target_count":2,"performed_count":1,"published_lessons_count":4,"status":"processing","scheduled_for":null,"started_at":"2025-01-01T00:01:00.000Z","completed_at":null,"created_by_id":3,"approved_by_id":null,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:01:00.000Z"},"required":["approved_by_id","auto_enroll","completed_at","course_id","created_at","created_by_id","id","offer_new_section_via_all_access_products","performed_count","public_id","published_lessons_count","scheduled_for","send_email","started_at","status","target_all","target_count","target_ids","updated_at"]},"CoursesSectionsPublishActionParameters":{"type":"object","title":"Course Section Publish Actions","description":"Parameters for creating a course-section publish action. Select exactly one of a nonempty `target_ids` array or `target_all: true`.","properties":{"target_all":{"type":"boolean","description":"Set to `true` to publish every unpublished non-root section of the course. Mutually exclusive with `target_ids`. Exactly one of `target_all` or `target_ids` must be supplied."},"target_ids":{"type":"array","items":{"type":"string"},"description":"Array of course-section public IDs to publish. Mutually exclusive with `target_all`. Exactly one of `target_ids` or `target_all` must be supplied."},"auto_enroll":{"type":"boolean","description":"When `true`, existing course enrollees are granted access to the newly published sections automatically."},"send_email":{"type":"boolean","description":"When `true` (requires `auto_enroll: true`), enrolled contacts receive an email notification about the newly published sections."},"offer_new_section_via_all_access_products":{"type":"boolean","description":"When `true`, products that grant full course access are updated to also include the newly published sections."},"scheduled_for":{"type":"string","format":"date-time","description":"Optional ISO 8601 datetime. The publish is deferred until this time. Must be a future datetime. Omit to publish immediately."}},"example":{"target_ids":["sSwcZK"],"auto_enroll":true,"send_email":true},"oneOf":[{"title":"Publish specific sections","required":["target_ids"],"properties":{"target_ids":{"minItems":1}}},{"title":"Publish all sections","required":["target_all"],"properties":{"target_all":{"const":true}}}]},"CoursesLessonAttributes":{"type":"object","title":"Lessons","description":"Lessons","properties":{"id":{"type":"integer","description":"ID"},"public_id":{"type":["string","null"],"description":"Public ID"},"title":{"type":"string","description":"Title"},"body":{"type":["string","null"],"description":"Description"},"section_id":{"type":["integer","null"],"description":"Parent module"},"published_at":{"type":["string","null"],"format":"date-time","description":"Schedule for"},"current_path":{"type":["string","null"],"description":"Current Path"},"sort_order":{"type":["integer","null"],"description":"Builder display order of the lesson within its section (section_id). Scoped per section, starting at 0."},"created_at":{"type":["string","null"],"format":"date-time","description":"Added"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"}},"example":{"id":1,"public_id":"ucGpIe","title":"Lesson 1","body":"Example Lesson","section_id":2,"published_at":"2025-01-01T00:00:00.000Z","current_path":null,"sort_order":0,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["body","created_at","current_path","id","public_id","published_at","section_id","sort_order","title","updated_at"]},"CoursesLessonParameters":{"type":"object","title":"Lessons","description":"Lessons","required":["title"],"properties":{"title":{"type":"string","description":"Title"},"body":{"type":["string","null"],"description":"Description"},"lesson_content":{"type":["string","null"],"description":"Markdown lesson content. This is the primary content field for the lesson; on create it is converted into the lesson's page content."},"image_id":{"type":["string","null"],"description":"Public ID of an image in the workspace to use as the lesson image."}},"example":{"courses_lesson":{"title":"Lesson 1","body":"Example Lesson","lesson_content":"## Welcome\nThis is the lesson content."}}},"CoursesLessonParametersUpdate":{"type":"object","title":"Lessons","description":"Lessons","required":[],"properties":{"title":{"type":"string","description":"Title"},"body":{"type":["string","null"],"description":"Description"},"lesson_content":{"type":["string","null"],"description":"Markdown lesson content. This is the primary content field for the lesson body. It is Markdown, 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)."},"image_id":{"type":["string","null"],"description":"Public ID of an image in the workspace to use as the lesson image."}},"example":{"courses_lesson":{"title":"Lesson 1","body":"Example Lesson","lesson_content":"## Welcome\nThis is the lesson content."}}},"CoursesLessonCompletionAttributes":{"type":"object","title":"Completed lessons","description":"Completed lessons","properties":{"id":{"type":"integer","description":"ID"},"public_id":{"type":["string","null"],"description":"Public ID"},"enrollment_id":{"type":"integer","description":"The ID of the `Courses::Enrollment` record that completed the lesson"},"lesson_id":{"type":"integer","description":"The ID of the `Courses::Lesson` record that was completed"},"completed_at":{"type":"string","format":"date-time","description":"The time when the record was completed; It is set automatically to the current time when the record is created"}},"example":{"id":1,"public_id":"MkFHBo","enrollment_id":2,"lesson_id":2,"completed_at":"2025-01-01T00:00:00.000Z"},"required":["completed_at","enrollment_id","id","lesson_id","public_id"]},"CoursesLessonCompletionParameters":{"type":"object","title":"Completed lessons","description":"Completed lessons","required":["enrollment_id","lesson_id"],"properties":{"enrollment_id":{"type":"integer","description":"The ID of the `Courses::Enrollment` record that completed the lesson"},"lesson_id":{"type":"integer","description":"The ID of the `Courses::Lesson` record that was completed"}},"example":{"courses_lesson_completion":{"enrollment_id":2,"lesson_id":2}}},"CoursesLessonCompletionParametersUpdate":{"type":"object","title":"Completed lessons","description":"Completed lessons","required":["enrollment_id","lesson_id"],"properties":{"enrollment_id":{"type":"integer","description":"The ID of the `Courses::Enrollment` record that completed the lesson"},"lesson_id":{"type":"integer","description":"The ID of the `Courses::Lesson` record that was completed"}},"example":{"courses_lesson_completion":{"enrollment_id":2,"lesson_id":2}}},"DiscountAttributes":{"type":"object","title":"Discount","description":"A reusable, workspace-scoped discount applied on top of a price.","properties":{"id":{"type":"integer","description":"Discount ID"},"public_id":{"type":["string","null"],"description":"Discount public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"name":{"type":"string","description":"Internal name for the discount."},"code":{"type":"string","description":"The code a buyer redeems at checkout. Uppercased on save; unique within the workspace (cannot collide with a coupon code)."},"discount_type":{"type":"string","enum":["code","automatic","sale"],"description":"`code` (the default) is a redeemable coupon code. `automatic` and `sale` are deprecated."},"discount_method":{"type":"string","enum":["percentage","fixed","shipping","bogo"],"description":"How the discount is calculated. `percentage` uses `percent`; `fixed` uses `amount`. `shipping` and `bogo` exist but are outside the simple flow."},"amount":{"type":["string","null"],"description":"Fixed amount off, as a decimal string (e.g. \"10.00\"). `null` for a percentage discount."},"percent":{"type":["string","null"],"description":"Percentage off between 0.01 and 100 (e.g. \"20.0\"). `null` for a fixed discount."},"currency":{"type":"string","description":"ISO currency code, lowercased. Defaults to the workspace currency."},"applies_to":{"type":"string","enum":["all_products","specific_products","specific_variants","specific_collections"],"description":"Scope of the discount. `all_products` (the default) applies workspace-wide; the `specific_*` values restrict it to the ids passed in `product_ids` / `variant_ids` / `products_collection_ids`."},"apply_from":{"type":"string","format":"date-time","description":"When the discount becomes active. Defaults to the creation time."},"apply_until":{"type":["string","null"],"format":"date-time","description":"When the discount expires. `null` means it never expires."},"limit_1_per_customer":{"type":"boolean","description":"When true, each contact can redeem the discount only once."},"require_minimum_spend":{"type":"boolean","description":"When true, the order must meet `require_minimum_spend_amount` for the discount to apply."},"require_minimum_spend_amount":{"type":["integer","null"],"description":"Minimum order subtotal required, when `require_minimum_spend` is true. In whole currency units, not cents - `50` on a `usd` discount means $50."},"discounts_per_redemption":{"type":["integer","null"],"description":"Optional cap on how many line items a single redemption discounts."},"redemptions_count":{"type":"integer","description":"How many times the discount has been redeemed on a completed sale. This is not a deletability signal - a discount can report zero redemptions and still return 422 on DELETE because it is attached to an order."},"product_ids":{"type":"array","items":{"type":"integer"},"description":"The products the discount is scoped to (empty unless `applies_to` is `specific_products`)."},"variant_ids":{"type":"array","items":{"type":"integer"},"description":"The variants the discount is scoped to (empty unless `applies_to` is `specific_variants`)."},"products_collection_ids":{"type":"array","items":{"type":"integer"},"description":"The collections the discount is scoped to (empty unless `applies_to` is `specific_collections`)."},"active":{"type":"boolean","description":"Derived - true when the discount is neither scheduled for the future nor expired."},"expired":{"type":"boolean","description":"Derived - true when `apply_until` is in the past. An expired discount is frozen - every further update returns 422, so rename before you expire."},"scheduled":{"type":"boolean","description":"Derived - true when `apply_from` is in the future."},"created_at":{"type":["string","null"],"format":"date-time","description":"Added"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"}},"example":{"id":771,"public_id":"gBEDMo","workspace_id":42000,"name":"Launch 20","code":"LAUNCH20","discount_type":"code","discount_method":"percentage","amount":null,"percent":"20.0","currency":"usd","applies_to":"all_products","apply_from":"2025-01-01T00:00:00.000Z","apply_until":null,"limit_1_per_customer":false,"require_minimum_spend":false,"require_minimum_spend_amount":null,"discounts_per_redemption":null,"redemptions_count":0,"product_ids":[],"variant_ids":[],"products_collection_ids":[],"active":true,"expired":false,"scheduled":false,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["active","amount","applies_to","apply_from","apply_until","code","created_at","currency","discount_method","discount_type","discounts_per_redemption","expired","id","limit_1_per_customer","name","percent","product_ids","products_collection_ids","public_id","redemptions_count","require_minimum_spend","require_minimum_spend_amount","scheduled","updated_at","variant_ids","workspace_id"]},"DiscountParameters":{"type":"object","title":"Discount","description":"Fields accepted when creating a discount.","required":["name"],"properties":{"name":{"type":"string","description":"Internal name for the discount."},"code":{"type":"string","pattern":"^[a-zA-Z0-9-]+$","description":"Required for a `code`-type discount. Letters, numbers and hyphens only - spaces, underscores and punctuation return 422. Uppercased on save; must be unique within the workspace (it cannot collide with a coupon code either)."},"discount_type":{"type":"string","enum":["code","automatic","sale"],"description":"Defaults to `code`."},"discount_method":{"type":"string","enum":["percentage","fixed","shipping","bogo"],"description":"Defaults to `percentage`. `percentage` requires `percent`; `fixed` requires a positive `amount`."},"percent":{"type":"string","description":"Percentage off (0.01-100). Required when `discount_method` is `percentage`."},"amount":{"type":"string","description":"Fixed amount off as a decimal string. Required when `discount_method` is `fixed`."},"currency":{"type":"string","description":"ISO currency code. Defaults to the workspace currency."},"applies_to":{"type":"string","enum":["all_products","specific_products","specific_variants","specific_collections"],"description":"Defaults to `all_products`."},"apply_from":{"type":"string","format":"date-time","description":"When the discount becomes active. Defaults to now. Set in the future to schedule it."},"apply_until":{"type":"string","format":"date-time","description":"When the discount expires. Omit for no expiry. There is no `expired` create field - sending one returns 422 whatever its value, including `false`, because expiring on create can never succeed (it would set `apply_until` to now, and `apply_from` then defaults to a hair later). Create the discount first, then expire it with `PATCH { \"discount\": { \"expired\": true } }`."},"limit_1_per_customer":{"type":"boolean"},"require_minimum_spend":{"type":"boolean"},"require_minimum_spend_amount":{"type":"integer","description":"Minimum order subtotal, in whole currency units rather than cents - `50` on a `usd` discount means $50. Must be positive when `require_minimum_spend` is true."},"discounts_per_redemption":{"type":"integer"},"product_ids":{"type":"array","items":{"type":"integer"},"description":"Product ids to scope to, when `applies_to` is `specific_products`."},"variant_ids":{"type":"array","items":{"type":"integer"},"description":"Variant ids to scope to, when `applies_to` is `specific_variants`."},"products_collection_ids":{"type":"array","items":{"type":"integer"},"description":"Collection ids to scope to, when `applies_to` is `specific_collections`."}},"example":{"name":"Launch 20","code":"LAUNCH20","discount_type":"code","discount_method":"percentage","percent":"20.0","applies_to":"all_products"}},"DiscountParametersUpdate":{"type":"object","title":"Discount","description":"Fields accepted when updating a discount. Two lock-out rules apply, in this order: once the discount has been redeemed on an order its money-affecting fields (amount, percent, discount_method, applies_to, apply_from, the scoping arrays, limit_1_per_customer, discounts_per_redemption) are locked and return 422, while renaming and expiring still work; a discount that is already expired freezes its other fields and returns 422 (`Discount cannot be changed because it has expired`). Expiring is reversible - `expired: false` clears the end date and a future `apply_until` pushes it out, either of which makes the discount live again - so editing an expired discount means lifting the expiry first. Expiring a discount and renaming it in the same request is fine; it is a rename sent to a discount that is already expired that gets refused.","required":[],"properties":{"name":{"type":"string"},"code":{"type":"string","pattern":"^[a-zA-Z0-9-]+$","description":"Letters, numbers and hyphens only. Uppercased on save; must be unique within the workspace."},"discount_type":{"type":"string","enum":["code","automatic","sale"],"description":"`code` is a redeemable coupon code. `automatic` and `sale` are deprecated."},"discount_method":{"type":"string","enum":["percentage","fixed","shipping","bogo"]},"percent":{"type":"string"},"amount":{"type":"string"},"currency":{"type":"string","description":"ISO currency code. Locked once the discount has been applied to an order."},"applies_to":{"type":"string","enum":["all_products","specific_products","specific_variants","specific_collections"]},"apply_from":{"type":"string","format":"date-time"},"apply_until":{"type":["string","null"],"format":"date-time","description":"Schedule a future end date. Must be after `apply_from`; a past date returns 422. To expire a live discount now, use `expired: true` instead."},"expired":{"type":"boolean","description":"Virtual switch over `apply_until`, accepted on update only (sending it on create returns 422). `true` expires the discount immediately by setting `apply_until` to now; `false` lifts an expiry by clearing `apply_until`, the same as Remove Expiration in the app. It ends a discount that has not started yet (`scheduled: true`) as well, discarding the future `apply_from`, since nothing can end before it starts. A discount that has been redeemed cannot be un-expired and returns 422. Sending the state the discount is already in changes nothing and returns 200 without moving `apply_until`, so echoing a serialized discount back in a routine update cannot clear a scheduled end date - to remove a future end date, PATCH `apply_until` to null instead. Only `true` and `false` are accepted; any other value returns 422 rather than being read as \"expire it\"."},"limit_1_per_customer":{"type":"boolean"},"require_minimum_spend":{"type":"boolean"},"require_minimum_spend_amount":{"type":"integer","description":"Minimum order subtotal, in whole currency units rather than cents - `50` on a `usd` discount means $50."},"discounts_per_redemption":{"type":"integer"},"product_ids":{"type":"array","items":{"type":"integer"}},"variant_ids":{"type":"array","items":{"type":"integer"}},"products_collection_ids":{"type":"array","items":{"type":"integer"}}},"example":{"expired":true}},"DomainAttributes":{"type":"object","title":"Domains","description":"Domains","properties":{"id":{"type":"integer","description":"Domain ID"},"public_id":{"type":"string","description":"The public identifier of the domain"},"workspace_id":{"type":"integer","description":"The ID of the workspace that the domain belongs to"},"name":{"type":"string","description":"The domain name (e.g. example.com)"},"status":{"type":"string","enum":["initialized","connecting","ownership_verified","securing","secured","removing"],"description":"The current connection status of the domain"},"connected":{"type":"boolean","description":"Whether the domain is fully connected and active"},"created_at":{"type":"string","format":"date-time","description":"Created at"},"updated_at":{"type":"string","format":"date-time","description":"Updated at"}},"example":{"id":1,"public_id":"aBcDeF","workspace_id":42000,"name":"example.com","status":"secured","connected":true,"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["connected","created_at","id","name","public_id","status","updated_at","workspace_id"]},"DownloadAttributes":{"type":"object","title":"Downloads","description":"Downloads","properties":{"id":{"type":"integer","description":"Download ID"},"public_id":{"type":["string","null"],"description":"Download public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"asset_id":{"type":["integer","null"],"description":"The Asset ID to pass in `product_variant.asset_ids` when granting this download through a product variant."},"name":{"type":["string","null"],"description":"Download name"},"created_at":{"type":["string","null"],"format":"date-time","description":"Added"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated"}},"example":{"id":73,"public_id":"VpQLxN","workspace_id":42000,"asset_id":904,"name":"Conversion Checklist.pdf","created_at":"2026-07-20T09:30:00.000Z","updated_at":"2026-07-21T14:45:00.000Z"},"required":["asset_id","created_at","id","name","public_id","updated_at","workspace_id"]},"EmailsAddressAttributes":{"type":"object","title":"Email Addresses","description":"Email Addresses","properties":{"id":{"type":"integer","description":"Address ID"},"public_id":{"type":["string","null"],"description":"Address public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"email_address":{"type":"string","description":"Email address"},"name":{"type":["string","null"],"description":"Display name associated with this email address"},"is_workspace_default":{"type":"boolean","description":"Whether this address is on the shared ClickFunnels sending domain (the workspace default). A workspace-default address is usable as a sender only as a fallback: once the workspace has a usable custom sender of its own, its workspace-default address reports `usable_as_sender: false`. So `is_workspace_default: true` together with `usable_as_sender: false` is expected whenever the workspace already has a usable custom sender."},"usable_as_sender":{"type":"boolean","description":"Whether this address is eligible to be used as the `from` sender of an email broadcast. A custom-domain address is usable once its sending domain is verified (DKIM/SPF/DMARC or a verified SMTP setting) and the workspace owns that domain. A workspace-default (shared-domain) address is usable only as a fallback - it is `true` when the workspace has no usable custom sender of its own and flips to `false` once one exists. Filter broadcast senders to addresses where this is true to avoid a broadcast failing validation at send time. 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)."},"emails_domain":{"type":["object","null"],"description":"Sending-domain verification status for this address. `null` for shared-domain / workspace-default addresses, which send via shared infrastructure and have no per-workspace sending domain.","properties":{"name":{"type":"string","description":"The sending domain name."},"verified":{"type":"boolean","description":"Whether the sending domain has completed transport verification (DKIM/SPF/DMARC DNS records, or a verified SMTP setting). This alone does not mean the address can send; select senders on the address's top-level `usable_as_sender` field."},"dkim_verified":{"type":"boolean","description":"Whether the domain's DKIM DNS record is verified."},"spf_verified":{"type":"boolean","description":"Whether the domain's SPF DNS record is verified."},"dmarc_verified":{"type":"boolean","description":"Whether the domain's DMARC DNS record is verified."},"smtp_verified":{"type":"boolean","description":"Whether the domain is verified via a verified SMTP setting (an alternative to DNS verification). A domain is `verified` when its DKIM/SPF/DMARC are all verified OR `smtp_verified` is true — so when a domain is SMTP-verified, `verified` is true while dkim_verified/spf_verified/dmarc_verified are false."}}},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at datetime"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at datetime"}},"example":{"id":1,"public_id":"AbCdEf","workspace_id":42000,"email_address":"marketing@example.com","name":"Marketing Team","is_workspace_default":false,"usable_as_sender":true,"emails_domain":{"name":"example.com","verified":true,"dkim_verified":true,"spf_verified":true,"dmarc_verified":true,"smtp_verified":false},"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["created_at","email_address","emails_domain","id","is_workspace_default","name","public_id","updated_at","usable_as_sender","workspace_id"]},"EmailsAddressParameters":{"type":"object","title":"Email Address","description":"A sender (from) email address.","required":[],"properties":{"username":{"type":"string","description":"The local part before the @ (e.g. \"hello\" for hello@yourdomain.com). Required when creating."},"domain":{"type":"string","description":"Selects among ClickFunnels' shared sending domains only; normally omit it to get the default (`clickfunnelsmail.com`). This is not how you use your own domain: putting a custom name here neither provisions nor authenticates it, and the request is rejected with `422` unless `emails_domain_id` is also given. To send from your own domain, provision it first and pass its numeric id as `emails_domain_id`, which is what the address is then created on."},"name":{"type":"string","description":"The from-name shown to recipients (e.g. \"Acme Support\"). Required when creating."},"label":{"type":"string","description":"Optional internal label."},"emails_domain_id":{"type":"integer","description":"Numeric `id` (not `public_id`) of a custom sending domain belonging to this workspace. Use the Email Domains endpoints to provision it and wait until that domain is ready to send before sending from the resulting address."}},"example":{"emails_address":{"username":"hello","name":"Acme Support"}}},"EmailsBroadcastAttributes":{"type":"object","title":"Email Broadcasts","description":"Email Broadcasts","properties":{"id":{"type":"integer","description":"Broadcast ID"},"public_id":{"type":["string","null"],"description":"Broadcast public ID"},"workspace_id":{"type":"integer","description":"Workspace ID"},"name":{"type":["string","null"],"description":"Internal name for the broadcast"},"subject":{"type":["string","null"],"description":"Email subject line seen by recipients"},"preheadline":{"type":["string","null"],"description":"Preview text shown in email clients before opening (max 150 characters)"},"status":{"type":"string","enum":["draft","scheduled","sending","paused","unhealthy","complete","canceled"],"description":"Current broadcast status. New broadcasts start as draft."},"origination_channel_type":{"type":["string","null"],"description":"The type of origination channel that created this broadcast"},"origination_channel_id":{"type":["integer","null"],"description":"The ID of the origination channel"},"external_id":{"type":["string","null"],"description":"An optional external identifier for tracking purposes"},"filter_id":{"type":["integer","null"],"description":"The contact filter determining which contacts receive this broadcast. Numeric `Refine::StoredFilter` id (not the public id) — the broadcast's own unnamed copy of the filter, created automatically from the `filter_id` (or `recipients`) supplied on create/update. `null` until an audience is set. See [Applying filters to email broadcasts](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#applying-filters-to-email-broadcasts).\n"},"send_at":{"type":["string","null"],"description":"Scheduled send date"},"send_at_local_time":{"type":["string","null"],"description":"Scheduled send time in HH:MM:SS format, relative to the specified time zone"},"time_zone":{"type":["string","null"],"description":"Time zone for scheduled sending"},"send_immediately":{"type":"boolean","description":"Whether the broadcast sends immediately upon creation"},"sending_at":{"type":["string","null"],"format":"date-time","description":"Timestamp when sending actually began"},"complete_at":{"type":["string","null"],"format":"date-time","description":"Timestamp when sending completed"},"from_email":{"type":["string","null"],"description":"The sender email address"},"from_name":{"type":["string","null"],"description":"The sender display name associated with the from address"},"reply_to_email":{"type":["string","null"],"description":"The reply-to email address"},"template":{"type":["object","null"],"description":"A lean reference to the email template this broadcast uses (a broadcast points at a template; it does not copy it, unlike a workflow send-email step). Null when no template is attached. The template's rendered body is not inlined here — fetch it from the templates endpoint via this public_id: GET /api/v2/emails/templates/{public_id}?expand[]=html_body.","properties":{"id":{"type":"integer","description":"Template ID"},"public_id":{"type":"string","description":"Template public ID"},"name":{"type":["string","null"],"description":"Template name"}}},"topic_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of topics associated with this broadcast"},"created_at":{"type":["string","null"],"format":"date-time","description":"Created at datetime"},"updated_at":{"type":["string","null"],"format":"date-time","description":"Updated at datetime"}},"example":{"id":1,"public_id":"GhIjKl","workspace_id":42000,"name":"Weekly Newsletter","subject":"This Week's Updates","preheadline":"Check out what's new","status":"draft","origination_channel_type":null,"origination_channel_id":null,"external_id":null,"filter_id":null,"send_at":null,"send_at_local_time":null,"time_zone":"Pacific Time (US & Canada)","send_immediately":false,"sending_at":null,"complete_at":null,"from_email":"marketing@example.com","from_name":"Marketing Team","reply_to_email":null,"template":{"id":3001,"public_id":"TmPl01","name":"Weekly Newsletter Template"},"topic_ids":[1,2],"created_at":"2025-01-01T00:00:00.000Z","updated_at":"2025-01-01T00:00:00.000Z"},"required":["complete_at","created_at","external_id","filter_id","from_email","from_name","id","name","origination_channel_id","origination_channel_type","preheadline","public_id","reply_to_email","send_at","send_at_local_time","send_immediately","sending_at","status","subject","template","time_zone","topic_ids","updated_at","workspace_id"]},"EmailsBroadcastParameters":{"type":"object","title":"Email Broadcasts","description":"Email Broadcasts","required":["name","from_email"],"properties":{"name":{"type":"string","description":"Internal name for the broadcast (required)"},"subject":{"type":"string","description":"Email subject line seen by recipients"},"preheadline":{"type":["string","null"],"description":"Preview text shown in email clients before opening. Maximum 150 characters."},"from_email":{"type":"string","description":"Sender email address. Required on create. Must be an email address that belongs to the workspace, and it must have `usable_as_sender: true` or the send is rejected with 422. Do not pick by the sending domain's `verified` flag: that covers email transport only. See GET /workspaces/{workspace_id}/emails/addresses, where a shared workspace-default address is usable only while the workspace has no ready custom sender."},"reply_to_email":{"type":["string","null"],"description":"Reply-to email address. Must be an address in the workspace if provided. Pick one whose `usable_as_sender` is `true`."},"html_body":{"type":["string","null"],"description":"HTML email body. If provided without a template_id, a template is automatically created from this content."},"text_body":{"type":["string","null"],"description":"Plain text email body"},"template_id":{"type":["integer","null"],"description":"Numeric id of an existing email template in this workspace to use. Alternative to providing html_body/text_body directly; takes precedence when both are given. The broadcast references this template (it is not copied)."},"filter_id":{"type":["string","integer","null"],"description":"Contact filter for the broadcast audience. Accepts any of three forms: the numeric `id` or the public id (string) of a saved contact filter (`Refine::StoredFilter`) in this workspace, or a serialized contact filter. The supplied filter is copied onto the broadcast — the broadcast points at its own copy, so later edits to (or deletion of) the saved filter never change this broadcast's audience. Saved contact filters can be created/listed via the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md). If `recipients` are provided instead, a filter is created automatically from them and takes precedence over `filter_id`. See [Applying filters to email broadcasts](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#applying-filters-to-email-broadcasts).\n"},"send_immediately":{"type":"boolean","description":"Set to true to send the broadcast immediately upon creation. If false, use send_at, send_at_local_time, and time_zone to schedule."},"send_at":{"type":["string","null"],"description":"Scheduled send date. Required when send_immediately is false."},"send_at_local_time":{"type":["string","null"],"description":"Scheduled send time in HH:MM:SS format. Defaults to 18:00:00."},"time_zone":{"type":["string","null"],"description":"Time zone for scheduling (defaults to workspace time zone)"},"external_id":{"type":["string","null"],"description":"An optional external identifier for your own tracking"},"topic_ids":{"type":"array","items":{"type":"integer"},"description":"Topic IDs to associate. Only topics belonging to the workspace are accepted."},"recipients":{"type":"array","items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","description":"Recipient email address (required)"},"first_name":{"type":["string","null"],"description":"Recipient first name"},"last_name":{"type":["string","null"],"description":"Recipient last name"}}},"description":"List of recipients (maximum 1,000). Contacts are created or matched by email address."}},"example":{"emails_broadcast":{"name":"Weekly Newsletter","subject":"This Week's Updates","preheadline":"Check out what's new","from_email":"marketing@example.com","reply_to_email":"replies@example.com","html_body":"