← All action domains

Funnels

83 operations. Call each with POST https://app.chirply.io/api/v1/actions/<name> and a bearer token; the response is { "data": { "action", "summary", "result" } }. A read badge means the operation changes nothing; write requires the credential’s write scope.

Connect a custom domain

funnel_domains.attachwriteconfirmadmin only

Point a real hostname the organization owns (e.g. offers.acme.com) at a funnel and register it for a public TLS certificate. This publishes the funnel on a NEW address on the open internet as soon as the tenant's CNAME resolves. Returns the DNS record they must create; use funnel_domains.verify afterwards.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredThe funnel the domain should serve.
domainstringrequiredThe hostname, e.g. offers.acme.com. Scheme and path are stripped.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_domains.attach \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "domain": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_domains_attach at https://app.chirply.io/api/mcp, same bearer token, same input.

Disconnect a custom domain

funnel_domains.detachwriteconfirmadmin only

Disconnect a custom domain and release its Cloudflare hostname and certificate. Everything served on that address STOPS immediately — the funnel, any single pages, and every LinkWizard link hosted on it, including copies already shared. The funnel itself, its /f/<slug> URL, and the links themselves are kept and can be moved elsewhere.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
domain_idstring (uuid)requiredThe connected domain to remove.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_domains.detach \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "domain_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_domains_detach at https://app.chirply.io/api/mcp, same bearer token, same input.

List custom domains

funnel_domains.listread

List the custom domains connected to the organization's funnels, with their verification and TLS status and the CNAME record the tenant has to create.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
funnel_idstring (uuid)optionalOnly domains attached to this funnel.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_domains.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool funnel_domains_list at https://app.chirply.io/api/mcp, same bearer token, same input.

Verify a custom domain

funnel_domains.verifywrite

Re-check a connected domain with Cloudflare and update its status. Run this once the CNAME record exists — certificate issuance is asynchronous and completes on its own within a few minutes.

Parameters

FieldTypeRequiredDescription
domain_idstring (uuid)requiredThe connected domain to re-check.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_domains.verify \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "domain_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_domains_verify at https://app.chirply.io/api/mcp, same bearer token, same input.

Edit a page with AI

funnel_pages.ai_editwriteconfirm

Apply a natural-language change to a page's draft document ("make the headline punchier", "add a testimonial section") and RETURN the new document — nothing is saved, so pass it to funnel_pages.save_content to keep it. The pre-edit document is snapshotted automatically. If the instruction implies a restyle, the funnel's theme IS changed immediately — that write is not held back for review, and it restyles every page of the funnel including any already published. SPENDS REAL MONEY: it runs on the organization's OWN OpenRouter API key, so the model charge lands directly on the tenant's OpenRouter bill. There is no credit pool and no free allowance — every call is billed and metered against this account, whether or not the result is any good.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe page to edit.
instructionstringrequiredWhat to change, in plain language. Under 1000 characters.
documentmap of string → objectoptionalDocument to edit. Omit to edit the page's stored draft.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.ai_edit \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "instruction": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_ai_edit at https://app.chirply.io/api/mcp, same bearer token, same input.

Inspect native page components

funnel_pages.component_schemaread

Read the native editor's actual component fields, defaults, layout slots and limits. Use this contract to create fully editable documents. No custom code is executed and no model is called.

Parameters

FieldTypeRequiredDescription
componentstringoptionalOptional exact component name to inspect; omit for the entire native registry.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.component_schema \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "component": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_component_schema at https://app.chirply.io/api/mcp, same bearer token, same input.

Add a funnel step

funnel_pages.createwrite

Add a page to the end of a funnel, seeded with a ready-made starter layout for the chosen step type. It is created as a draft; publish it separately with funnel_pages.publish.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredThe funnel to add the step to.
namestringrequiredThe step's name — also the basis of its URL path.
step_type"optin" | "sales" | "order" | "upsell" | "downsell" | "thankyou" | … 2 moreoptionalWhat job the page does — it picks the starter layout. Default: "generic"

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.create \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "name": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_create at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete a funnel step

funnel_pages.deletewriteconfirm

PERMANENTLY DESTROY a page, its live content and its entire version history. This cannot be undone. The home page cannot be deleted — it is the funnel's entry point; delete the funnel instead.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe page to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.delete \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Build the page

funnel_pages.generatewriteconfirm

Use AI to write and design a complete new page, then append it to an existing funnel or website as a private DRAFT. It does not publish the page and contacts nobody. SPENDS REAL MONEY: it runs on the organization's OWN OpenRouter API key, so the model charge lands directly on the tenant's OpenRouter bill. There is no credit pool and no free allowance — every call is billed and metered against this account, whether or not the result is any good.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredThe funnel, website, or course to add the generated page to.
namestringrequiredThe new page's name and the basis of its URL path.
promptstringrequiredWho the page is for, what it should communicate, and what visitors should do next.
step_type"optin" | "sales" | "order" | "upsell" | "downsell" | "thankyou" | … 2 moreoptionalThe conversion job this page should perform. Default: "generic"

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.generate \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "name": "Example",
    "prompt": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_generate at https://app.chirply.io/api/mcp, same bearer token, same input.

Generate a page with AI

funnel_pages.generate_contentwriteconfirm

Generate a complete page document from a prompt and RETURN it for review — no page is created or changed. Pass the result to funnel_pages.save_content to keep it. SPENDS REAL MONEY: it runs on the organization's OWN OpenRouter API key, so the model charge lands directly on the tenant's OpenRouter bill. There is no credit pool and no free allowance — every call is billed and metered against this account, whether or not the result is any good.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe page this is for — checked before any AI spend.
promptstringrequiredWhat the page should say and who it is for.
step_type"optin" | "sales" | "order" | "upsell" | "downsell" | "thankyou" | … 2 moreoptionalOverride the page's step type for this generation.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.generate_content \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "prompt": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_generate_content at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a funnel page

funnel_pages.getread

Fetch one page with BOTH documents: `content` is the working draft you edit, `published_content` is what visitors currently see. Read this before editing a page — funnel_pages.save_content expects a document in the same shape.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe page's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_get at https://app.chirply.io/api/mcp, same bearer token, same input.

List funnel steps

funnel_pages.listread

List a funnel's pages in step order. Page documents are omitted — call funnel_pages.get for a page's content.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
funnel_idstring (uuid)requiredThe funnel whose steps to list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_list at https://app.chirply.io/api/mcp, same bearer token, same input.

List page versions

funnel_pages.list_versionsread

List a page's saved restore points, newest first — every publish, every AI edit, and every manual snapshot. Documents are omitted; funnel_pages.restore_version brings one back.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
page_idstring (uuid)requiredThe page whose history to list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.list_versions \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_list_versions at https://app.chirply.io/api/mcp, same bearer token, same input.

Apply native page changes

funnel_pages.patchwrite

Apply an atomic batch of native component operations to a page draft with revision checking and an automatic restore point. Nested slots and property paths are supported. A failed operation or stale revision rejects the entire batch. Nothing is published and no AI is called.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredAccount-owned page to patch.
expected_revisionstringrequiredupdated_at from the latest page read; required to avoid overwriting another editor.
operationsany[]requiredNative PatchOp objects: insert, remove, move, update, setProp and other supported editor operations. Inspect component_schema for valid fields.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.patch \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "expected_revision": "example",
    "operations": [
      null
    ]
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_patch at https://app.chirply.io/api/mcp, same bearer token, same input.

Publish a page

funnel_pages.publishwriteconfirm

PUT THIS PAGE ON THE PUBLIC INTERNET. Copies the working draft over the live version, so whatever the draft currently says becomes what visitors see at /f/<slug>/<path>. If the funnel itself is still a draft it is published too, because a live page inside an offline funnel is unreachable. A restore point is saved first, so this is undoable via funnel_pages.restore_version.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe page to put live.
expected_revisionstringoptionalRevision from updated_at returned by the last read or save. Stale writes are rejected.
documentmap of string → objectoptionalOptional newer document to publish. Omit to publish the stored draft as-is.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.publish \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_publish at https://app.chirply.io/api/mcp, same bearer token, same input.

Reorder funnel steps

funnel_pages.reorderwrite

Set the order visitors move through a funnel's steps. Pass every page id of the funnel in the order you want; the first one must be the funnel's home page. Order only — no content or URL changes.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredThe funnel being reordered.
page_idsarray of (string (uuid))requiredEvery page id of the funnel, in the new step order.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.reorder \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "page_ids": [
      "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
    ]
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_reorder at https://app.chirply.io/api/mcp, same bearer token, same input.

Restore a page version

funnel_pages.restore_versionwrite

Bring a saved version back into the page's WORKING DRAFT. The live page is not touched — publish afterwards if you want visitors to see it. The draft being replaced is snapshotted first, so a restore is itself undoable.

Parameters

FieldTypeRequiredDescription
version_idstring (uuid)requiredThe version to restore. See funnel_pages.list_versions.
expected_revisionstringoptionalRevision from updated_at returned by the last read or save. Stale writes are rejected.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.restore_version \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "version_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_restore_version at https://app.chirply.io/api/mcp, same bearer token, same input.

Save a page draft

funnel_pages.save_contentwrite

Save a strictly validated native page document as the working draft. Invalid components and props are rejected with paths, never discarded. The prior draft is snapshotted atomically. Pass expected_revision from the last read to reject stale writes. Live visitors keep the published snapshot.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe page whose draft to overwrite.
documentmap of string → objectrequiredThe page as a Puck editor document: { "root": { "props": {} }, "content": [ { "type": "Hero", "props": { … } }, … ] }. Each entry in `content` is one section; `type` must be a registered component name and `props` are its settings (nested sections live inside slot props). Unrecognised component types are silently dropped on save, so ALWAYS read the page with funnel_pages.get and edit the document it returns rather than authoring one from scratch.
expected_revisionstringoptionalRevision from updated_at returned by the last read or save. Stale writes are rejected.
mode"simple" | "pro"optionalEditor depth this page is edited in. 'simple' shows pre-designed sections, 'pro' adds layout primitives. Purely a UI preference — both read the same document.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.save_content \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "document": {}
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_save_content at https://app.chirply.io/api/mcp, same bearer token, same input.

Redirect a page

funnel_pages.set_redirectwriteconfirm

Make a published page send visitors somewhere else instead of rendering. Takes effect after the next publish, on every address it is served at, including the funnel's custom domain. The page's content is kept untouched — pass an empty redirect_url to switch it back on. Works on the home page too, which is how a whole single-page site gets redirected.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe page to redirect.
redirect_urlstringrequiredFull web address to send visitors to. Pass an empty string to stop redirecting and show the page again.
redirect_code301 | 302optional302 is a normal redirect you can change later. 301 tells browsers to remember it permanently — later changes may never reach people who already visited. Default: 302

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.set_redirect \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "redirect_url": "https://example.com"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_set_redirect at https://app.chirply.io/api/mcp, same bearer token, same input.

Save a restore point

funnel_pages.snapshotwrite

Save a named restore point for a page. Nothing about the page changes — this only records what the draft looks like now so it can be brought back later.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe page to snapshot.
labelstringoptionalA name for the restore point.
documentmap of string → objectoptionalDocument to record. Omit to snapshot the page's stored draft.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.snapshot \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_snapshot at https://app.chirply.io/api/mcp, same bearer token, same input.

Take a page offline

funnel_pages.unpublishwriteconfirm

Take one live page off the public internet — visitors on its URL immediately stop being able to reach it. The rest of the funnel stays live. The draft and the last published content are kept, so publishing again restores it.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe page to take offline.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.unpublish \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_unpublish at https://app.chirply.io/api/mcp, same bearer token, same input.

Rename a funnel step

funnel_pages.updatewriteconfirm

Rename a page, change its draft URL path, or change its step type with revision checking. Path changes update the site's native draft links, redirects and shared sections together, and require whole-site publication. Live content keeps its old routes until then. Publishing moves the public URL; external inbound links require an explicit redirect. Pause running A/B tests before renaming routes. The home page remains fixed at the site root.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe page to edit.
expected_revisionstringoptionalupdated_at from the latest page read; supply it to reject edits based on an outdated page.
namestringoptionalNew step name.
pathstringoptionalNew URL path segment, slugified before saving.
step_type"optin" | "sales" | "order" | "upsell" | "downsell" | "thankyou" | … 2 moreoptionalNew step type.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.update \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_update at https://app.chirply.io/api/mcp, same bearer token, same input.

Save SEO

funnel_pages.update_seowrite

Save a page's search title, meta description, canonical URL, social image, and search-index visibility. This changes metadata on the working page record; published pages retain their metadata until the next publish.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredPage whose search metadata should be updated.
titlestringoptionalSearch and social title, or omit to clear it.
descriptionstringoptionalSearch result description, or omit to clear it.
canonicalstring (uri)optionalPreferred absolute URL for duplicate-content consolidation.
og_imagestring (uri)optionalAbsolute social sharing image URL.
no_indexbooleanoptionalTrue to keep this page out of search engine indexes. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.update_seo \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_update_seo at https://app.chirply.io/api/mcp, same bearer token, same input.

Validate a page document

funnel_pages.validateread

Check a proposed native document against the same strict field and layout contract used by saves and publishing. Returns precise issues without removing unsupported content. No page changes or paid calls occur.

Parameters

FieldTypeRequiredDescription
documentanyrequiredComplete native Puck page document to validate.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_pages.validate \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "document": null
  }'
Test with your API key

Over MCP the same operation is the tool funnel_pages_validate at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete a funnel template

funnel_templates.deletewriteconfirm

PERMANENTLY DESTROY one of the organization's saved funnel templates, including every page document frozen inside it. This cannot be undone. Funnels already built from it are unaffected. Built-in platform templates can't be deleted.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe template to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_templates.delete \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_templates_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a template

funnel_templates.getread

Fetch one funnel or website template with its theme, niche, tags, setup checklist, and the full editable document of every page it carries. Use funnel_templates.use to copy all its pages as a private draft, then funnel_pages.ai_edit and funnel_pages.save_content to customize them. This read creates and publishes nothing.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe template's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_templates.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_templates_get at https://app.chirply.io/api/mcp, same bearer token, same input.

List templates

funnel_templates.listread

List the funnel and website templates available to start from: the organization's own saved ones plus the built-in niche library. Returns each template's niche, tags, page names and paths, and setup checklist so you can choose a complete starting point. Every template is a frozen, fully editable copy of its theme and pages; listing creates and publishes nothing.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
category"lead-gen" | "sales" | "webinar" | "ecommerce" | "other"optionalOnly templates in this category.
template_type"funnel" | "page" | "section"optionalFilter funnel templates, page templates (including complete multi-page websites), or reusable sections. Read page_count to distinguish a website from an individual page.
include_platformbooleanoptionalInclude the shared templates the platform provides. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_templates.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool funnel_templates_list at https://app.chirply.io/api/mcp, same bearer token, same input.

Save a funnel as a template

funnel_templates.save_from_funnelwrite

Freeze a funnel's theme and every page's WORKING DRAFT into a reusable template. It is a snapshot, not a link — editing the funnel afterwards never changes the template, and funnels built from it are never coupled back to it.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredThe funnel to freeze.
namestringrequiredWhat to call the template.
descriptionstringoptionalWhat this template is for.
category"lead-gen" | "sales" | "webinar" | "ecommerce" | "other"optionalGrouping in the picker. Default: "other"

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_templates.save_from_funnel \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "name": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_templates_save_from_funnel at https://app.chirply.io/api/mcp, same bearer token, same input.

Use template

funnel_templates.usewrite

Create a new funnel or website from a template — theme and every page copied in, with fresh component ids. Optionally pass color_scheme to change colors across every page while keeping fonts and layout. Returns each new page id and builder link, plus a setup checklist. Every section remains editable in the builder and by AI: call funnel_pages.ai_edit with a page id, then funnel_pages.save_content to keep the returned document. Everything lands as a DRAFT and is never published automatically; installation sends no messages and charges no payments.

Parameters

FieldTypeRequiredDescription
template_idstring (uuid)requiredThe template to build from.
namestringoptionalName for the new funnel or website. Defaults to the template's name.
color_schemeobjectoptionalChange only colors across every page while preserving fonts, layout, spacing, content and button style. Supply either a preset or both custom colors.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnel_templates.use \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnel_templates_use at https://app.chirply.io/api/mcp, same bearer token, same input.

A/B test results

funnels.ab_test_resultsread

Per-arm results for an A/B test: visitors, views, form submissions, paid orders, revenue (cents), conversion rate, and a plain-language statistical readout. Conversions = submissions + orders. A verdict is only called "confident" at p < 0.05 with at least 100 visitors in each arm; below that the readout says to keep collecting.

Parameters

FieldTypeRequiredDescription
variant_idstring (uuid)requiredThe A/B test to report on.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.ab_test_results \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "variant_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_ab_test_results at https://app.chirply.io/api/mcp, same bearer token, same input.

Yes, add it to my order

funnels.accept_upsellwriteconfirm

Accept a one-click upsell or downsell on a funnel — the button on the offer page after a purchase. THIS CHARGES MONEY IMMEDIATELY AND WITH NO CARD ENTRY: it creates a NEW Stripe PaymentIntent and confirms it off-session against the card already saved on the original order, so the buyer is charged again the moment this returns. The only credential involved is the order token, which is why the window is short — the original order must be PAID and less than two hours old, or the charge is refused. What is sold and what it costs come from the upsell block's OWN published definition and the product table, never from this call, so a token buys that page's offer at that page's price and nothing else. Charging the same offer twice on the same order is prevented by a unique constraint, so a repeat call is a no-op rather than a double charge. On success it records the revenue against the page and fires the account's `upsell_accepted` automations, which can send real messages billed to the tenant's own provider accounts. There is no undo — reversing it means refunding in Stripe.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
slugstringrequiredThe funnel's public slug. Must be published, owned by this account, and the same funnel the order was placed on.
page_pathstringrequiredThe published upsell or downsell page's path within the funnel — the page carrying the offer being accepted.
block_idstringrequiredThe id of the UpsellOffer block on that page. Read it with funnel_pages.get and take the `id` of the component whose type is 'UpsellOffer'. The product and price are read from this block, not from your input.
tokenstringrequiredThe order token from funnels.checkout, for the PAID original order this add-on attaches to. It is the only thing authorising the charge, and it stops working two hours after the order was created.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.accept_upsell \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "slug": "example",
    "page_path": "example",
    "block_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "token": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_accept_upsell at https://app.chirply.io/api/mcp, same bearer token, same input.

Complete my order

funnels.checkoutwriteconfirm

Start a REAL purchase through a published funnel's order form: creates the order, creates or matches a Stripe customer on the seller's own account, and returns a PaymentIntent client secret for collecting the card. THIS IS THE LIVE CHECKOUT — unless the funnel is set to test mode (funnels.set_payment_route), the card charged is charged for real, on the tenant's own Stripe, and Stripe's fees apply. What is being sold and what it costs come from the ORDER FORM'S OWN published definition and from the product table, never from this call: you name the block, and the price is re-derived server-side, so there is no way to buy a $997 offer for $1. Nothing is collected yet at this point — the order is created as 'pending' and the card still has to be confirmed by whoever holds the client secret; call funnels.complete_checkout with the returned token once it clears. The returned `token` is a BEARER CREDENTIAL: for the next two hours it alone authorises funnels.accept_upsell to charge the saved card again with no further card entry, so treat it like a password and never store it where a reader of orders could reach it.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
slugstringrequiredThe funnel's public slug — the `<slug>` in /f/<slug>. Must be published and owned by this account.
page_pathstringoptionalThe published page's path within the funnel. Empty string (the default) is the home page. Default: ""
block_idstringrequiredThe id of the OrderForm block on that published page. Read it with funnel_pages.get and take the `id` of the component whose type is 'OrderForm'. The products and prices are read from this block, not from your input.
buyer_emailstring (email)requiredThe buyer's email address. Required — it is how the order is receipted and matched to a CRM contact.
buyer_namestringoptionalThe buyer's name, as it should appear on the order.
buyer_phonestringoptionalThe buyer's phone number, used for CRM matching and deduplication.
accept_bumpbooleanoptionaltrue adds the order form's bump offer to this purchase, if the block defines one — the tick-box beside the order form. It increases the amount charged. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.checkout \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "slug": "example",
    "block_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "buyer_email": "ada@example.com"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_checkout at https://app.chirply.io/api/mcp, same bearer token, same input.

Settle a funnel order

funnels.complete_checkoutwriteconfirm

Settle a funnel order once its card payment has cleared: asks STRIPE whether the payment actually succeeded — the caller's word is never taken for it — and, if it did, marks the order paid, saves the card for one-click upsells, links or creates the buyer's CRM contact, records the revenue against the page, and fires the account's `purchase_made` automations, which can send real email, SMS or voicemail billed to the tenant's own provider accounts. Idempotent: an order already settled (by this call or by Stripe's webhook, which is authoritative and will settle it either way) simply reports 'paid' and does nothing again. This exists because the very next funnel step is usually a one-click upsell, which needs the order to be paid with a saved card NOW rather than whenever the webhook lands. It does not charge anything itself.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
tokenstringrequiredThe order token returned by funnels.checkout. It is a bearer credential — it identifies the order and authorises action on it.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.complete_checkout \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_complete_checkout at https://app.chirply.io/api/mcp, same bearer token, same input.

Create a site

funnels.createwrite

Create a draft funnel, standalone website, or members-only member site and seed its home page with a ready-made layout. A member site (kind 'course', kept for compatibility) enables member login but does not publish or grant anyone access. Nothing is visible until funnels.publish is called. Actual courses (modules/lessons/quizzes) are built with the courses.* capabilities and mounted on a member site.

Parameters

FieldTypeRequiredDescription
namestringrequiredWhat the funnel, website, or member site is called.
kind"funnel" | "page" | "course"optional'funnel' is a conversion sequence; 'page' is a standalone website; 'course' is a MEMBER SITE — a website with member login enabled for gated pages, communities, and classroom content (the value name predates the Courses module). Default: "funnel"
preset"clean" | "midnight" | "bold" | "warm" | "forest" | "luxury" | … 2 moreoptionalTheme preset for every page. See funnels.list_theme_presets. Default: "clean"
stripe_account_idstring (uuid)optionalConnected Stripe account that collects payments on this funnel or website. If omitted, the first connected account is pinned.
payment_mode"live" | "test"optionallive collects real money; test uses that account's Stripe test credentials. Default: "live"
step_type"optin" | "sales" | "order" | "upsell" | "downsell" | "thankyou" | … 2 moreoptionalWhat job the seeded home page does — it picks the starter layout. Default: "generic"

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.create \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_create at https://app.chirply.io/api/mcp, same bearer token, same input.

Test a different version

funnels.create_ab_variantwrite

Create an A/B test on a funnel page: a full, independently editable copy of the page's current live content ("version B"). Created as a DRAFT — no visitor sees it and nothing changes on the live page until funnels.start_ab_test is called. A page can hold one active test at a time; creating a second returns an error naming the existing one.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe funnel page to test a second version of.
labelstringoptionalDisplay name for the challenger. Defaults to "Version B".

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.create_ab_variant \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_create_ab_variant at https://app.chirply.io/api/mcp, same bearer token, same input.

Declare an A/B test winner

funnels.declare_ab_winnerwriteconfirm

CONCLUDE AN A/B TEST, IRREVERSIBLY CHANGING WHAT VISITORS SEE. Declaring 'b' OVERWRITES the live page's published content (and its draft) with the challenger's document — every visitor sees it immediately; the beaten version is kept only as a restore point in the page's version history. Declaring 'a' keeps the page exactly as it is and archives the challenger. Either way the traffic split stops and the test cannot be restarted.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
variant_idstring (uuid)requiredThe running or paused A/B test to conclude.
winner"a" | "b"required'a' keeps the current page (challenger archived); 'b' makes the challenger the live page.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.declare_ab_winner \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "variant_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "winner": "a"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_declare_ab_winner at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete a funnel

funnels.deletewriteconfirm

PERMANENTLY DESTROY a funnel and everything under it: every page and its published content, every saved version, the funnel's captured submissions, and its connected custom domains. This cannot be undone. Templates already saved from it, and funnels built from those templates, are unaffected.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe funnel to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.delete \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Discard an A/B test

funnels.discard_ab_testwriteconfirm

Archive a draft or paused A/B test without adopting it: the challenger document stops being served or editable, its collected results are closed out, and the test cannot be restarted. The LIVE PAGE IS NOT TOUCHED — visitors keep seeing it exactly as published. A running test must be paused (funnels.stop_ab_test) or concluded (funnels.declare_ab_winner) instead.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
variant_idstring (uuid)requiredThe draft or paused A/B test to discard.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.discard_ab_test \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "variant_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_discard_ab_test at https://app.chirply.io/api/mcp, same bearer token, same input.

Duplicate a funnel

funnels.duplicatewrite

Copy a funnel — its theme and every page's working draft — into a brand-new DRAFT funnel on a fresh URL. Component ids are regenerated so the copy and the original can never interfere. Nothing is published, and the original is untouched.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe funnel to copy.
namestringoptionalName for the copy. Defaults to "<original> (copy)".

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.duplicate \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_duplicate at https://app.chirply.io/api/mcp, same bearer token, same input.

Build with AI

funnels.generatewriteconfirm

Start a durable AI site build that plans, writes and checks native editable pages in the background. Returns a build id immediately; use site_builds.get for progress, issues and the saved draft. Nothing is published. SPENDS REAL MONEY on the account’s connected AI provider, up to max_calls model attempts. The run pauses on missing input or its call limit and can resume without rebuilding completed pages.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idempotency_keystringoptionalReuse the same request key to recover the same run after a timeout. Use 8–128 letters, digits, dots, colons, underscores or hyphens.
max_callsintegeroptionalMaximum paid AI model attempts authorized for this run, including repairs and generated assets. Default: 48
max_spend_usdnumber (or null)optionalTotal provider charge ceiling in USD, including reservations for outstanding calls. Default $10. Explicit null authorizes call-count budgeting without a dollar cap. Unsupported price ceilings pause before a request. Default: 10
visual_reviewbooleanoptionalUse actual desktop/tablet/phone screenshots for AI design critique and bounded native style repairs, consuming the same authorized AI budget. Default: true
promptstringrequiredWhat the funnel is for: the business, the offer, the audience and the goal.
kind"funnel" | "website" | "member_site"optionalBuild a sequential conversion funnel or a multi-page public website. Default: "funnel"

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.generate \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_generate at https://app.chirply.io/api/mcp, same bearer token, same input.

Generate a page image

funnels.generate_imagewriteconfirm

Generate an image from a description, store it in the organization's media bucket, and return its permanent URL for use in a page component's image prop. SPENDS REAL MONEY: it runs on the organization's OWN OpenRouter API key, so the model charge lands directly on the tenant's OpenRouter bill. There is no credit pool and no free allowance — every call is billed and metered against this account, whether or not the result is any good.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
promptstringrequiredWhat the image should show. Keep it under 600 characters.
stylestringoptionalVisual style, e.g. "photo", "illustration", "3d". Default: "photo"

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.generate_image \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_generate_image at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a funnel

funnels.getread

Fetch one funnel with its steps (pages), connected custom domains, theme, and total form submissions. Page documents are omitted — use funnel_pages.get for a page's content.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe funnel's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_get at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a funnel order

funnels.get_orderread

Fetch one FUNNEL checkout order with its buyer, payment status, amount and refunded amount, plus every line item — the main product, any order bump, and each upsell or downsell that was accepted, with what each was charged. commerce.get_order refuses anything that is not a storefront order, so this is the only reader for these. Amounts are in the smallest currency unit (cents). Read-only. The order token is never returned: it is a bearer credential that can charge the card saved on this order.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe funnel order's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.get_order \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_get_order at https://app.chirply.io/api/mcp, same bearer token, same input.

Import captured page

funnels.import_capturewrite

Creates an unpublished, editable page from a captured browser page in an account-owned funnel. Source scripts are excluded; no page is published or messages sent.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredAccount-owned funnel to receive the draft.
sourceobjectrequiredBrowser capture to convert into editable blocks.
source.urlstring (uri)requiredOriginal source page URL.
source.titlestringrequiredPage title to use for the draft.
source.blocksobject[]requiredVisible page blocks captured in document order.
source.scriptsobject[]optionalDetected source scripts; these are excluded from the draft. Default: []
source.scripts[].srcstringoptionalScript URL, when external.
source.scripts[].codestringoptionalInline script preview, when present.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.import_capture \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "source": {
      "url": "https://example.com",
      "title": "Example",
      "blocks": [
        {
          "kind": "heading",
          "text": "example"
        }
      ]
    }
  }'
Test with your API key

Over MCP the same operation is the tool funnels_import_capture at https://app.chirply.io/api/mcp, same bearer token, same input.

Import page

funnels.import_urlwriteconfirm

Uses the account's Firecrawl connection to read one public URL and create an unpublished, editable page in an account-owned funnel. Firecrawl credits may be billed to the connected provider account. Source scripts are detected and excluded; no page is published.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredAccount-owned funnel to receive the draft.
urlstring (uri)requiredPublic HTTP or HTTPS page URL to import.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.import_url \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "url": "https://example.com"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_import_url at https://app.chirply.io/api/mcp, same bearer token, same input.

List funnels

funnels.listread

List the organization's funnels, most recently edited first. Each funnel is a sequence of landing pages served at /f/<slug>.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
status"draft" | "published" | "archived"optionalOnly funnels in this status.
querystringoptionalText to match in the funnel name, slug or description.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool funnels_list at https://app.chirply.io/api/mcp, same bearer token, same input.

List A/B tests

funnels.list_ab_testsread

List the A/B tests in this account — per test: the page it runs on, label, traffic weight, lifecycle status (draft/running/paused/winner/archived), and when it started or concluded. Filter by funnel, page, or status. Use funnels.ab_test_results for the numbers.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
funnel_idstring (uuid)optionalOnly tests on this funnel's pages.
page_idstring (uuid)optionalOnly tests on this page.
status"draft" | "running" | "paused" | "winner" | "archived"optionalOnly tests in this lifecycle state.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.list_ab_tests \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool funnels_list_ab_tests at https://app.chirply.io/api/mcp, same bearer token, same input.

List funnel orders

funnels.list_ordersread

List orders taken through the organization's FUNNEL checkouts — the Orders screen under Funnels — newest first, each with buyer, payment status, amount, refunded amount and, unless you turn them off, its line items (main product, order bump, upsells and downsells). This is the funnel side of the business and it has no other reader: commerce.list_orders answers only for the storefront and hard-excludes everything here. Amounts are in the smallest currency unit (cents), and collected revenue is total minus refunded counting ONLY orders whose status is 'paid' — a 'pending' order is an abandoned checkout, not a sale. Read-only. The order token is never returned: it is a bearer credential that can charge a buyer's saved card.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
funnel_idstring (uuid)optionalOnly orders placed through this funnel. Omit for every funnel in the account.
status"pending" | "paid" | "failed" | "refunded" | "partially_refunded"optionalOnly orders in this payment state. 'pending' means a checkout was started and the card never cleared (an abandoned cart); 'paid' is a completed sale.
contact_idstring (uuid)optionalOnly orders linked to this CRM contact.
querystringoptionalText to match in the buyer's name or email address.
include_itemsbooleanoptionalInclude each order's line items — the only way to see what was actually bought and which upsells were taken. Costs one extra query. Default: true
source"funnel" | "storefront" | "manual" | "api" | "any"optionalWhere the order came from. Defaults to 'funnel', the funnel checkout, which is what the Orders screen shows. 'any' returns every order in the account, storefront ones included. Default: "funnel"

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.list_orders \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool funnels_list_orders at https://app.chirply.io/api/mcp, same bearer token, same input.

Published release history

funnels.list_releasesread

List the last 50 immutable public releases for this site, including publications and rollbacks. This reads history without changing drafts or what visitors see.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredAccount-owned site whose publication history to list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.list_releases \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_list_releases at https://app.chirply.io/api/mcp, same bearer token, same input.

List funnel submissions

funnels.list_submissionsread

Read website inquiries and funnel opt-in submissions, newest first, including every submitted answer and the linked CRM contact. Filter by website, page or contact. This is read-only; it does not contact anyone or run automations.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
funnel_idstring (uuid)optionalOnly submissions from this funnel.
page_idstring (uuid)optionalOnly submissions from this page.
contact_idstring (uuid)optionalOnly website inquiries and funnel submissions linked to this CRM contact.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.list_submissions \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool funnels_list_submissions at https://app.chirply.io/api/mcp, same bearer token, same input.

List theme presets

funnels.list_theme_presetsread

List complete design themes and color-only schemes for websites and funnels. The presets array includes typography and spacing; color_schemes changes only colors and preserves the design. Pass a color_schemes id as color_scheme.preset to funnels.set_theme or funnel_templates.use. This read saves or publishes nothing.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.list_theme_presets \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool funnels_list_theme_presets at https://app.chirply.io/api/mcp, same bearer token, same input.

Match a screenshot

funnels.match_screenshotwriteconfirm

Analyze a reference website screenshot and restyle a supplied page document to match its visual direction using only structured, editable builder components. Returns the revised draft document but does not save or publish it — pass it to funnel_pages.save_content to keep it. SPENDS REAL MONEY: it runs on the organization's OWN OpenRouter API key, so the model charge lands directly on the tenant's OpenRouter bill. There is no credit pool and no free allowance — every call is billed and metered against this account, whether or not the result is any good. TWO billed calls per run: the vision pass over the screenshot, then the page edit.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
documentanyrequiredCurrent structured Puck page document to restyle.
image_urlstringrequiredHTTPS image URL or PNG/JPG/WebP data URL containing the reference screenshot.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.match_screenshot \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "document": null,
    "image_url": "https://example.com"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_match_screenshot at https://app.chirply.io/api/mcp, same bearer token, same input.

Publish a funnel

funnels.publishwriteconfirm

PUT THIS FUNNEL ON THE PUBLIC INTERNET. Every validated draft page and the draft theme are published together and become reachable at /f/<slug> (and on any active custom domain) to anyone with the link, with no login. Publish only when the content is ready to be seen by customers.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe funnel to put live.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.publish \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_publish at https://app.chirply.io/api/mcp, same bearer token, same input.

Restore live release

funnels.restore_releasewriteconfirm

Restore a previously published site's page content, routes, SEO, access presentation and design tokens together for real visitors. Keeps current working drafts and saves the outgoing live state. Running A/B tests are paused. This changes the live site immediately; it does not grant entitlements, change current product prices or charge anyone.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
release_idstring (uuid)requiredRelease id from funnels.list_releases.
expected_revisionstringrequiredCurrent site's updated_at from funnels.get; rejects a rollback if the site changed since review.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.restore_release \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "release_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "expected_revision": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_restore_release at https://app.chirply.io/api/mcp, same bearer token, same input.

Rewrite page copy

funnels.rewrite_copywriteconfirm

Rewrite one snippet of page copy — a headline, a subhead, a button label — and return the new text. No page is changed; write the result back with funnel_pages.save_content yourself. SPENDS REAL MONEY: it runs on the organization's OWN OpenRouter API key, so the model charge lands directly on the tenant's OpenRouter bill. There is no credit pool and no free allowance — every call is billed and metered against this account, whether or not the result is any good.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
textstringrequiredThe copy to rewrite.
instructionstringrequiredHow to change it. Either free text, or one of the editor presets: punchier, shorter, longer, clearer, benefit, urgent.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.rewrite_copy \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "example",
    "instruction": "example"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_rewrite_copy at https://app.chirply.io/api/mcp, same bearer token, same input.

Save payment settings

funnels.set_payment_routewriteconfirm

Choose which connected Stripe account collects the money for a funnel, and whether it charges in live or test mode. THIS DECIDES WHERE REAL CUSTOMER MONEY LANDS. Pointing it at the wrong account sends this funnel's takings to another business's Stripe; setting mode to 'test' means every checkout on the funnel's LIVE published pages silently stops charging anyone — the pages keep working and buyers keep getting confirmation, and nothing is collected. It applies from the next checkout onward: orders already placed keep the account and mode pinned onto them at the time, so nothing in the past moves. The equivalent for a storefront is commerce.update_store; funnels.update deliberately does not accept these two columns, so this is the only way to set them.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredThe funnel whose payment route to set.
stripe_account_idstring (uuid)requiredThe connected Stripe account that will collect payments for this funnel: a `stripe_accounts` row id belonging to THIS account (see stripe.list_accounts). That is Chirply's own id for the connection, not a Stripe `acct_…` id. An account from another account is rejected.
payment_mode"live" | "test"optional'live' takes real money on the account's live keys. 'test' uses its Stripe TEST credentials, so checkouts on the funnel's published pages complete without charging anyone — useful for a rehearsal, catastrophic if left on. Default: "live"

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.set_payment_route \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "stripe_account_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_set_payment_route at https://app.chirply.io/api/mcp, same bearer token, same input.

Change a funnel's theme

funnels.set_themewrite

Save site-wide design tokens as an unpublished draft. To change only colors and preserve fonts, spacing, buttons and content, pass color_scheme with a preset or custom brand/background colors. Alternatively pass a complete theme preset, overrides, or both. Every page uses the changes after the next publish; no live page changes or messages are sent now.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredThe funnel to restyle.
preset"clean" | "midnight" | "bold" | "warm" | "forest" | "luxury" | … 2 moreoptionalA curated preset id from funnels.list_theme_presets.
thememap of string → objectoptionalDesign-token overrides: brand, brandForeground, background, surface, text, muted, border (hex colors); headingFont/bodyFont (sans|serif|mono|display|rounded|condensed); radius (none|sm|md|lg|full); buttonStyle (solid|gradient|outline|soft); density (compact|comfortable|spacious); typeScale (restrained|balanced|dramatic); surfaceStyle (flat|outlined|elevated|glass); motion (none|subtle|expressive). Invalid values fall back to the preset's.
color_schemeobjectoptionalChange only colors across every page while preserving fonts, layout, spacing, content and button style. Supply either a preset or both custom colors.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.set_theme \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_set_theme at https://app.chirply.io/api/mcp, same bearer token, same input.

Start an A/B test

funnels.start_ab_testwriteconfirm

PUT THE TEST IN FRONT OF REAL VISITORS. From the moment this runs (within about a minute of cache), the chosen percentage of visitors to the page is served the challenger document instead of the live page. Assignment is deterministic and sticky per visitor. Also resumes a paused test. The variant must not have concluded.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
variant_idstring (uuid)requiredThe draft or paused A/B test to start.
weightintegeroptionalPercentage of visitors served version B. Defaults to the variant's stored weight (50 unless changed).

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.start_ab_test \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "variant_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_start_ab_test at https://app.chirply.io/api/mcp, same bearer token, same input.

Funnel performance

funnels.statsread

Conversion stats per step for a funnel over the last N days: views, unique visitors, form submissions, paid orders and revenue (cents, net of refunds). This is what the Performance report on the funnel page shows.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredThe funnel to report on.
daysintegeroptionalHow many days back to include, ending today. Default: 30

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.stats \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_stats at https://app.chirply.io/api/mcp, same bearer token, same input.

Pause an A/B test

funnels.stop_ab_testwrite

Pause a running A/B test: within about a minute every visitor sees the original page again. Results collected so far are kept, and the test can be resumed with funnels.start_ab_test or concluded with funnels.declare_ab_winner.

Parameters

FieldTypeRequiredDescription
variant_idstring (uuid)requiredThe running A/B test to pause.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.stop_ab_test \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "variant_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_stop_ab_test at https://app.chirply.io/api/mcp, same bearer token, same input.

Submit form

funnels.submit_formwriteconfirm

Submit a real opt-in form on a PUBLISHED funnel page, exactly as a visitor filling it in would. THIS IS NOT A TEST: it creates or updates a REAL CRM CONTACT from the email and phone in the answers, stores a funnel submission against the page, counts toward that page's conversion stats, and immediately fires every `form_submitted` automation in the account — which can send real email, SMS or ringless voicemail to that person and bill the tenant's own provider accounts for it. There is no draft and no undo. Field names and which are required are read from the form's OWN published definition, not from what you send, so an answer for a field the form does not have is ignored and a missing required field is an error. Deduplication is the platform's: one phone number is one contact, matched on email first and then phone in any spelling it might be stored under, so submitting twice updates one person rather than creating two. Use funnels.list_submissions to read what has already come in.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
slugstringrequiredThe funnel's public slug — the `<slug>` in /f/<slug>. It must be PUBLISHED and belong to this account.
page_pathstringoptionalThe published page's path within the funnel, e.g. 'thank-you'. Empty string (the default) is the funnel's home page. Default: ""
block_idstringrequiredThe id of the Optin block on that published page. Read the page with funnel_pages.get and take the `id` of the component whose type is 'Optin'.
valuesmap of string → stringrequiredThe answers, keyed by the form field's `name` (lower-cased), e.g. {"email":"jane@acme.com","first_name":"Jane"}. Fields the published form does not define are ignored; a field the form marks required must be present and non-empty. An `email`/`phone`/`first_name`/`last_name`/`name` field is what gets mapped onto the CRM contact.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.submit_form \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "slug": "example",
    "block_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "values": {}
  }'
Test with your API key

Over MCP the same operation is the tool funnels_submit_form at https://app.chirply.io/api/mcp, same bearer token, same input.

Take a funnel offline

funnels.unpublishwriteconfirm

Take a live funnel off the public internet. Visitors on /f/<slug> and on any custom domain immediately stop being able to reach it. Content and pages are kept — publish again to restore it.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe funnel to take offline.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.unpublish \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_unpublish at https://app.chirply.io/api/mcp, same bearer token, same input.

Rename a funnel

funnels.updatewriteconfirm

Rename a funnel or change its description or public slug. CHANGING THE SLUG MOVES THE FUNNEL'S PUBLIC URL: every link already shared at the old /f/<slug> — in sent emails, in live ads, on printed material, in other people's posts — breaks immediately and there is no redirect from the old address. Renaming alone is internal and safe; the slug is the irreversible part. Omitted fields are left alone.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe funnel to edit.
namestringoptionalNew funnel name.
descriptionstring (or null)optionalInternal description.
slugstringoptionalNew public slug. Slugified before saving and unique across the whole platform.
stripe_account_idstring (uuid) (or null)optionalConnected Stripe account that collects every payment on this funnel or website.
payment_mode"live" | "test" (or null)optionalStripe environment for this funnel or website.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.update \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_update at https://app.chirply.io/api/mcp, same bearer token, same input.

Edit an A/B test variant

funnels.update_ab_variantwriteconfirm

Change an A/B test's challenger: its document (same Puck shape as a page's content), its label, or the share of traffic that sees it. Pause a running test before editing it. Concluded tests cannot be edited.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
variant_idstring (uuid)requiredThe A/B test variant to change.
contentmap of string → objectoptionalThe page as a Puck editor document: { "root": { "props": {} }, "content": [ { "type": "Hero", "props": { … } }, … ] }. Each entry in `content` is one section; `type` must be a registered component name and `props` are its settings (nested sections live inside slot props). Unrecognised component types are silently dropped on save, so ALWAYS read the page with funnel_pages.get and edit the document it returns rather than authoring one from scratch.
expected_revisionstringoptionalRevision from updated_at returned by the last read or save. Stale writes are rejected.
labelstringoptionalNew display name for the challenger.
weightintegeroptionalPercentage of visitors served this version (0–100). Changing it mid-test reassigns visitors — prefer setting it before start.

Example

curl -X POST https://app.chirply.io/api/v1/actions/funnels.update_ab_variant \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "variant_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool funnels_update_ab_variant at https://app.chirply.io/api/mcp, same bearer token, same input.

Add page from template

page_templates.add_to_funnelwrite

Add a new draft page to an existing funnel or website from an individual-page template. Complete multi-page website templates must use funnel_templates.use so no pages are discarded. The copied builder document receives fresh component ids, stays fully editable, and is never published automatically.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)requiredThe funnel that will receive the new page.
template_idstring (uuid)requiredThe individual-page template to copy.
namestringoptionalName for the new page; defaults to the template name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/page_templates.add_to_funnel \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "template_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool page_templates_add_to_funnel at https://app.chirply.io/api/mcp, same bearer token, same input.

Save page as template

page_templates.save_from_pagewrite

Freeze one funnel page's current working draft as a reusable individual-page template. It is a private snapshot; later edits to either the source page or a copied page never change the other.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe page whose working draft will be frozen.
namestringrequiredName shown in the page template picker.
descriptionstringoptionalWhen this page template should be used.
category"lead-gen" | "sales" | "webinar" | "ecommerce" | "other"optionalGrouping in the template library. Default: "other"

Example

curl -X POST https://app.chirply.io/api/v1/actions/page_templates.save_from_page \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "name": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool page_templates_save_from_page at https://app.chirply.io/api/mcp, same bearer token, same input.

Archive or restore a product

products.archivewrite

Take a product out of the builder's pickers (archive) or put it back (restore). Products are archived rather than deleted because past orders reference them and a sold product has to stay resolvable for reporting.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe product to archive or restore.
activebooleanoptionalfalse archives it, true restores it. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/products.archive \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool products_archive at https://app.chirply.io/api/mcp, same bearer token, same input.

Create a product

products.createwrite

Add a sellable product to the catalogue so it can be attached to an order form, an order bump or a one-click upsell inside the builder. Creating a product charges nobody — checkouts run on the organization's own connected Stripe account, and nothing can be sold until Stripe is connected.

Parameters

FieldTypeRequiredDescription
namestringrequiredThe product name buyers see.
pricestringrequiredThe price as a decimal amount in the product currency — "49", "49.00" or "$1,299.99". NOT cents.
compare_atstringoptionalOptional strikethrough "was" price, same format. Display only; never charged.
kind"one_time" | "recurring"optionalOne-off purchase or a subscription. Default: "one_time"
recurring_interval"day" | "week" | "month" | "year"optionalBilling interval. Only used when kind is 'recurring'. Default: "month"
currencystringoptionalThree-letter currency code. Default: "usd"
descriptionstringoptionalShort description shown beside the offer.
image_urlstring (uri)optionalProduct image URL.
stripe_account_idstring (uuid) (or null)optionalConnected Stripe account that collects this product. If omitted, the first connected account is pinned.
payment_mode"live" | "test"optionallive moves real money; test uses the selected account's Stripe test credentials. Default: "live"

Example

curl -X POST https://app.chirply.io/api/v1/actions/products.create \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example",
    "price": "example"
  }'
Test with your API key

Over MCP the same operation is the tool products_create at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a product

products.getread

Fetch one product with its pricing, currency and billing interval.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe product's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/products.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool products_get at https://app.chirply.io/api/mcp, same bearer token, same input.

List products

products.listread

List what the organization's funnels sell. A product can be the main offer on one funnel's order form and the order bump or one-click upsell on another. Amounts are integer cents.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
activebooleanoptionaltrue for the live catalogue, false for archived products.
querystringoptionalText to match in the name or description.

Example

curl -X POST https://app.chirply.io/api/v1/actions/products.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool products_list at https://app.chirply.io/api/mcp, same bearer token, same input.

Edit a product

products.updatewriteconfirm

Update a product's name, price, currency, billing kind, artwork, or which Stripe account and live/test mode it charges on. THIS CHANGES WHAT REAL BUYERS ARE CHARGED: a new price takes effect at the next checkout on every funnel offering this product, and switching payment_mode to 'test' means live customers' cards stop actually being charged while the pages carry on looking like they are working (switching to 'live' does the reverse). Past orders are never rewritten — an order item copies the amount at purchase time. Omitted fields are left alone.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe product to edit.
namestringoptionalNew product name. Buyers SEE this — it is the line item on the order form, the receipt and the order record. Omit to leave it alone.
pricestringoptionalNew price as a decimal amount — "49" or "49.00". NOT cents. This is what the next real buyer is charged; orders already placed keep the amount they were charged.
compare_atstring (or null)optionalStrikethrough "was" price shown beside the real one, as a decimal amount. null clears it. Presentation only — it is never charged.
kind"one_time" | "recurring"optional'one_time' charges once at checkout; 'recurring' bills the buyer's card on a repeating schedule set by recurring_interval. Switching this changes how future buyers are billed — it does not migrate anyone already subscribed.
recurring_interval"day" | "week" | "month" | "year"optionalFor a recurring product, how often the buyer is billed: day, week, month or year. Ignored for one-time products.
currencystringoptionalThree-letter ISO currency the price is charged in, e.g. 'usd'. Lower-cased and cut to three characters. A product in one currency cannot be bought alongside a bump or upsell in another.
descriptionstring (or null)optionalBuyer-facing description shown on the order form beside the product. null clears it.
image_urlstring (uri) (or null)optionalPublic https URL of the product image shown to buyers. Use a media-library URL from assets.list or assets.upload so it can't break later. null removes the image.
stripe_account_idstring (uuid) (or null)optionalConnected Stripe account that collects this product.
payment_mode"live" | "test"optionallive moves real money; test uses the selected account's Stripe test credentials.

Example

curl -X POST https://app.chirply.io/api/v1/actions/products.update \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool products_update at https://app.chirply.io/api/mcp, same bearer token, same input.

Add saved section

section_templates.insert_into_pagewrite

Append a fresh editable copy of a saved section to the bottom of a page's working draft. The public page is unchanged until someone publishes it.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe page that will receive the section.
template_idstring (uuid)requiredThe reusable section template to insert.
expected_revisionstringoptionalThe page updated_at revision read before this edit. A changed revision rejects the insertion instead of overwriting another editor.

Example

curl -X POST https://app.chirply.io/api/v1/actions/section_templates.insert_into_page \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "template_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool section_templates_insert_into_page at https://app.chirply.io/api/mcp, same bearer token, same input.

Save section as template

section_templates.save_from_pagewrite

Freeze one top-level section from a page's working draft as a reusable section template, including its nested columns, copy, images, and styles. Creating the template publishes nothing.

Parameters

FieldTypeRequiredDescription
page_idstring (uuid)requiredThe page containing the section.
component_idstringrequiredThe top-level builder component id to save.
namestringrequiredName shown in the section template shelf.
descriptionstringoptionalWhere this section is intended to be reused.
category"lead-gen" | "sales" | "webinar" | "ecommerce" | "other"optionalGrouping in the template library. Default: "other"

Example

curl -X POST https://app.chirply.io/api/v1/actions/section_templates.save_from_page \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "component_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "name": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool section_templates_save_from_page at https://app.chirply.io/api/mcp, same bearer token, same input.

Approve resource setup

site_builds.approve_resourceswriteconfirm

Approve the exact reviewed CMS draft entries, local membership access definitions and paused manual follow-up workflows for a site build. CMS and access setup requires account management permission. Reviewed access setup enables native login for an unpublished new site; an existing published site requires explicitly enabling login first. Creates no member grants, sends no messages, activates no workflow and publishes no pages. Continuing the build SPENDS REAL MONEY within its already approved AI allowance.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe build id returned by funnels.generate or site_builds.list.
expected_revisionstringrequiredCurrent build updated_at from site_builds.get; approval is rejected if the plan changed.
resourcesobjectrequiredExact resource specifications and draft copy reviewed by the caller. Every blocking missing fact must be resolved before approval.
resources.version1optionalVersion of the reviewed resource contract. Default: 1
resources.collectionsobject[]optionalSite-owned CMS collections and reviewed draft entries to create atomically. Default: []
resources.collections[].keystringrequiredStable machine key used to retain identity across retries and plan review.
resources.collections[].namestringrequiredReviewed text grounded in the supplied business brief and facts.
resources.collections[].slugstringrequiredLowercase URL segment using letters, digits and hyphens.
resources.collections[].pathstringrequiredLowercase URL segment using letters, digits and hyphens.
resources.collections[].descriptionstringrequiredReviewed text grounded in the supplied business brief and facts.
resources.collections[].groundingstringrequiredReviewed text grounded in the supplied business brief and facts.
resources.collections[].fieldsobject[]requiredNative structured fields available to entry editors and template bindings.
resources.collections[].fields[].keystringrequiredStable machine key used to retain identity across retries and plan review.
resources.collections[].fields[].labelstringrequiredField name shown to content editors.
resources.collections[].fields[].type"text" | "richtext" | "number" | "boolean" | "date" | "image" | … 1 morerequiredNative CMS field value and editor type.
resources.collections[].fields[].requiredbooleanoptionalWhether every proposed entry must contain this field. Default: false
resources.collections[].fields[].helpstringoptionalInstructions shown to the content editor.
resources.collections[].entriesobject[]requiredActual content drafts to create; none will be published.
resources.collections[].entries[].keystringrequiredStable machine key used to retain identity across retries and plan review.
resources.collections[].entries[].titlestringrequiredExact title to save as a draft.
resources.collections[].entries[].slugstringrequiredLowercase URL segment using letters, digits and hyphens.
resources.collections[].entries[].excerptstringoptionalExact summary to show in draft collection cards. Default: ""
resources.collections[].entries[].datamap of string → objectrequiredActual reviewed values keyed by the collection's declared fields; unknown fields are rejected.
resources.collections[].listPageKeysstring[]requiredStable keys of existing pages in the reviewed site plan.
resources.collections[].templatePageKeystringrequiredPlanned native page that renders individual CMS entries.
resources.accessProductsobject[]optionalLocal access definitions for gated draft pages. Grants access to nobody and creates no billing objects. Default: []
resources.accessProducts[].keystringrequiredStable machine key used to retain identity across retries and plan review.
resources.accessProducts[].namestringrequiredReviewed text grounded in the supplied business brief and facts.
resources.accessProducts[].descriptionstringrequiredReviewed text grounded in the supplied business brief and facts.
resources.accessProducts[].groundingstringrequiredReviewed text grounded in the supplied business brief and facts.
resources.accessProducts[].pageKeysstring[]requiredStable keys of existing pages in the reviewed site plan.
resources.workflowsobject[]optionalPaused manual-trigger follow-ups; no contacts are enrolled and no messages are sent. Default: []
resources.workflows[].keystringrequiredStable machine key used to retain identity across retries and plan review.
resources.workflows[].namestringrequiredReviewed text grounded in the supplied business brief and facts.
resources.workflows[].descriptionstringrequiredReviewed text grounded in the supplied business brief and facts.
resources.workflows[].groundingstringrequiredReviewed text grounded in the supplied business brief and facts.
resources.workflows[].pageKeysstring[]requiredStable keys of existing pages in the reviewed site plan.
resources.workflows[].frameworkstringrequiredSupplied copywriting framework used for this follow-up.
resources.workflows[].voicestringrequiredWorkspace brand voice used for the reviewed copy.
resources.workflows[].stepsobject[]requiredOrdered editable workflow actions and real waits; workflow stays paused and manual.
resources.blockersobject[]optionalUnresolved requirements which block approval and provisioning. Default: []
resources.blockers[].keystringrequiredStable machine key used to retain identity across retries and plan review.
resources.blockers[].messagestringrequiredSpecific missing fact, price or content that must be supplied before setup.

Example

curl -X POST https://app.chirply.io/api/v1/actions/site_builds.approve_resources \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "expected_revision": "example",
    "resources": {}
  }'
Test with your API key

Over MCP the same operation is the tool site_builds_approve_resources at https://app.chirply.io/api/mcp, same bearer token, same input.

Cancel build

site_builds.cancelwriteconfirm

Cancel the remaining AI work for a site build. Completed draft pages and activity stay available. No more tasks can commit results; provider requests already sent may still be billed. Cancelling does not unpublish or delete any site.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe build id returned by funnels.generate or site_builds.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/site_builds.cancel \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool site_builds_cancel at https://app.chirply.io/api/mcp, same bearer token, same input.

View AI build progress

site_builds.getread

Read a saved site's build plan, task progress, issues and activity. Reports partial and failed work explicitly. This polling call never spends money or drives the runner.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe build id returned by funnels.generate or site_builds.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/site_builds.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool site_builds_get at https://app.chirply.io/api/mcp, same bearer token, same input.

Choose build connections

site_builds.input_resourcesread

List up to 200 active products and booking events in this account for resolving a site's build plan. Returns resource ids and names only; makes no paid calls and changes no records.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/site_builds.input_resources \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool site_builds_input_resources at https://app.chirply.io/api/mcp, same bearer token, same input.

List AI site builds

site_builds.listread

List saved AI site builds in this account, including progress, remaining call allowance and unresolved issues. Reads only; it does not run a model or change any page.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMaximum recent builds to return. Default: 25

Example

curl -X POST https://app.chirply.io/api/v1/actions/site_builds.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25
  }'
Test with your API key

Over MCP the same operation is the tool site_builds_list at https://app.chirply.io/api/mcp, same bearer token, same input.

Pause build

site_builds.pausewrite

Pause an AI site build at its saved checkpoint. A provider request already sent may still be billed, but its late result cannot overwrite the draft after this control takes effect. Completed draft pages are kept.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe build id returned by funnels.generate or site_builds.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/site_builds.pause \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool site_builds_pause at https://app.chirply.io/api/mcp, same bearer token, same input.

Refresh provider charges

site_builds.reconcile_spendwrite

Retrieve authoritative provider receipts for uncertain requests already sent by this build, updating actual charges and releasing only reconciled reservations. Makes no new AI generation request and incurs no generation charge. Missing provider receipts remain explicitly uncertain.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe build id returned by funnels.generate or site_builds.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/site_builds.reconcile_spend \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool site_builds_reconcile_spend at https://app.chirply.io/api/mcp, same bearer token, same input.

Resume build

site_builds.resumewriteconfirm

Resume an AI site build from saved progress, retrying unfinished work. SPENDS REAL MONEY on the account's connected AI provider within the remaining call allowance. Optionally authorize additional paid attempts; completed pages are preserved and nothing is published.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe build id returned by funnels.generate or site_builds.list.
additional_callsintegeroptionalAdditional paid model attempts to authorize. Zero uses only the existing allowance. Default: 0
resolutionobjectoptionalResolve missing facts and resource connections before resuming. Existing page keys and routes are kept.
resolution.factsstringoptionalVerified additional business facts to use in unfinished pages.
resolution.answersmap of string → stringoptionalAnswers to missing facts, keyed by the requirement's zero-based index.
resolution.bindingsobject[]optionalExplicit product and booking connections for the planned pages.
resolution.bindings[].pageKeystringrequiredStable page key from the saved plan.
resolution.bindings[].productIdstringoptionalActive account-owned product id, or empty to clear.
resolution.bindings[].bookingEventIdstringoptionalActive account-owned booking event id, or empty to clear.

Example

curl -X POST https://app.chirply.io/api/v1/actions/site_builds.resume \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool site_builds_resume at https://app.chirply.io/api/mcp, same bearer token, same input.

Save plan and continue

site_builds.revise_planwriteconfirm

Apply a reviewed sitemap revision and continue building added or explicitly selected pages. Preserves existing page content by default and keeps excluded pages intact. Changes draft routes and shared navigation; nothing is published. Resumed generation SPENDS REAL MONEY within the existing AI call and dollar allowances.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe build id returned by funnels.generate or site_builds.list.
expected_plan_revisionintegerrequiredCurrent plan_revision from site_builds.get; rejects another editor's intervening plan changes.
plananyrequiredComplete saved plan from site_builds.get with reviewed changes to steps, creativeDirection, context or requirements. Preserve stable step keys, schemaVersion, project kind and resources. Steps contain key,name,path,stepType,brief,requiredChecks,access and optional productId/bookingEventId. Home is first with empty path; other paths have no leading slash.
regenerate_pagesobject[]optionalExisting pages to regenerate. Omit to preserve their saved content; new planned pages are generated automatically. Default: []
regenerate_pages[].page_keystringrequiredStable key of an existing page whose content you explicitly authorize replacing.
regenerate_pages[].expected_revisionstringrequiredExact current page updated_at reviewed before authorizing regeneration.

Example

curl -X POST https://app.chirply.io/api/v1/actions/site_builds.revise_plan \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "expected_plan_revision": 1,
    "plan": null
  }'
Test with your API key

Over MCP the same operation is the tool site_builds_revise_plan at https://app.chirply.io/api/mcp, same bearer token, same input.

Save AI spending limit

site_builds.set_budgetwriteconfirm

Change the total authorized AI provider spending limit for a saved build. This authorizes REAL MONEY spending when the build resumes. Explicit null removes the dollar cap while retaining its AI call allowance. The new cap must cover recorded charges and outstanding reservations. Pause active work before changing it; this action does not resume the build.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe build id returned by funnels.generate or site_builds.list.
expected_revisionstringrequiredCurrent build updated_at reviewed before changing its allowance.
max_spend_usdnumber (or null)requiredTotal cap in USD with at most two decimal places (10 means $10), or explicit null to authorize call-count budgeting without a dollar ceiling.

Example

curl -X POST https://app.chirply.io/api/v1/actions/site_builds.set_budget \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "expected_revision": "example",
    "max_spend_usd": 1
  }'
Test with your API key

Over MCP the same operation is the tool site_builds_set_budget at https://app.chirply.io/api/mcp, same bearer token, same input.

The machine-readable version of this page is GET https://app.chirply.io/api/v1/actions?domain=funnels — same operations, with full JSON Schemas. Authentication, errors and rate limits are covered in the API documentation home.