Skip to main content

Funnels

These tools cover the full AI-powered funnel lifecycle: create a funnel from a natural-language brief, request content edits, rename or re-publish to a custom domain, and poll an async job until generation completes. A typical flow is create_funnelget_funnel_job_status (loop until completed) → update_funnel_metadata to set the final URL, then update_funnel for any subsequent content revisions.

Before calling create_funnel you must pick (or create) a brand profile via list_brands and get_brand — the brand's colors, typography, and voice are woven into the generation brief automatically.

Tools

ToolPurposeKey inputsReturns
create_funnelCreate a funnel and start async AI HTML generationdata.name, data.prompt, one of data.brandId / data.noBrandjobId, funnelId, status: "pending"
update_funnelRequest an AI content edit on an existing funnelfunnelId, promptjobId, funnelId, editorUrl, status: "pending"
update_funnel_metadataRename a funnel or publish it to a custom domain/slugfunnelId, data (name, domainId, slug)Updated funnel object
get_funnel_job_statusPoll a generation or edit job (long-poll, ~20 s per call)jobIdStatus + funnel URLs when completed

create_funnel

Starts AI generation of a brand-new funnel from a natural-language brief. The call is non-blocking: it creates an empty funnel shell, kicks off the AI generation job, and returns immediately with status: "pending". Poll get_funnel_job_status until status: "completed" to get the live URL.

The funnel is published automatically when generation completes. Pass domainId and/or slug to land on a custom URL; otherwise it publishes under the default Perspective domain.

Mandatory pre-call flow:

  1. Call list_brands and present the user with a 4-option brand-pick choice.
  2. Call get_brand (or use the create_brand response directly) to load brand identity.
  3. Ask 3–5 brand-aware clarification questions (goal, audience temperature, length, primary objection).
  4. Then call this tool with brandId set (or noBrand: true if the user declined a brand).

Inputs

NameTypeRequiredDescription
data.namestringYesShort human-readable funnel name
data.promptstringYesNatural-language brief built from brand-aware clarification answers; cover goal, audience temperature, length tolerance, primary objection
data.brandIdstringExactly one of brandId / noBrandID of the brand profile to apply (from list_brandsget_brand)
data.noBrandtrueExactly one of brandId / noBrandSet only after the user actively chooses to create without a brand
data.workspaceIdstringNoTarget workspace; defaults to account default
data.domainIdstringNoDomain to publish the funnel under once generation completes
data.slugstringNoURL path segment; combined with domainId{domainUrl}/{slug}. Letters, digits, and hyphens only

Returns { data: { jobId, funnelId, status: "pending" } }.

update_funnel

Appends a natural-language edit instruction to the funnel's existing AI conversation. Changes are published automatically to the funnel's current live URL when the edit job completes. Only one generation may run at a time per funnel — poll get_funnel_job_status until the current job is done before calling again.

Inputs

NameTypeRequiredDescription
funnelIdstringYesID of the funnel to edit (from create_funnel or list_workspaces)
promptstringYesNatural-language description of the change to make (e.g. "make the headline punchier and add a testimonials section")

Returns { data: { jobId, funnelId, editorUrl, status: "pending" } }.

update_funnel_metadata

Renames a funnel or changes its published domain/slug without touching the funnel content. At least one of name, domainId, or slug must be provided. Providing domainId or slug (or both) triggers a republish of the funnel to the new URL.

Inputs

NameTypeRequiredDescription
funnelIdstringYesID of the funnel to update (from create_funnel or list_workspaces)
data.namestringNoNew funnel name (minimum 1 character)
data.domainIdstringNoDomain to publish under; providing this republishes the funnel
data.slugstringNoPublish slug in kebab-case (letters, digits, and hyphens only; no slashes, underscores, spaces, or dots). Empty string clears the current slug. Providing this republishes the funnel

At least one of data.name, data.domainId, or data.slug must be set; the call is rejected if all three are omitted.

Returns { data: { id, name, slug, domainId, ... } } — the updated funnel object (without previewUrl).