← All action domains

Domains

28 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.

Add route

domains.add_funnel_routewriteconfirmadmin only

Publish an additional funnel on a named route of a connected domain. The funnel home becomes /route and its pages live below it (for example /summer/checkout). If the funnel is already published, this makes it reachable at the new address immediately. The route is rejected if a website page, short link, another funnel, or a reserved system route already uses 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
domain_idstring (uuid)requiredThe connected domain that will host the funnel.
funnel_idstring (uuid)requiredThe funnel to publish below the named route.
pathstringrequiredOne URL segment without slashes, e.g. 'summer-offer'.

Example

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

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

Cancel a pending domain purchase

domains.cancel_purchasewriteadmin only

Call off a domain purchase that was started with domains.purchase but never confirmed by a human in the browser. Cancels the pending order and releases the uncaptured card hold at Stripe, so it stops showing on the card's statement. Safe to call any time: if the order already completed (paid) or never carried a hold, this does nothing — the domain was never registered by the unconfirmed purchase either way, so there is nothing else to undo.

Parameters

FieldTypeRequiredDescription
order_idstring (uuid)requiredThe pending order's id, returned as order_id by domains.purchase.

Example

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

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

Check a domain

domains.check_availabilityread

Check whether specific domain names are available and what they would cost. Read-only — nothing is reserved or charged.

Parameters

FieldTypeRequiredDescription
domainsstring[]requiredFull domain names to check, e.g. ['acmeroofing.com', 'acme.co'].

Example

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

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

Cloudflare DNS status

domains.cloudflare_statusreadadmin only

Report whether its own Cloudflare account is connected for automatic DNS, and list the zones (domains) that account can manage — each with Cloudflare's status for it and whether records written there would actually govern the domain (a zone Cloudflare has marked moved/deactivated accepts writes that change nothing). Read-only — changes nothing in Cloudflare. Zone names reveal which domains the organization runs, so this is manager-only like the integration itself.

Parameters

No parameters — POST an empty body.

Example

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

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

Connect a domain

domains.connectwriteconfirmadmin only

Connect a domain the organization ALREADY OWNS at another registrar (e.g. go.acme.com) and request a public TLS certificate for it. Does not buy anything and costs no money. If the account has its Cloudflare account connected (the cloudflare integration), the required CNAME is CREATED AUTOMATICALLY in the organization's own Cloudflare zone — replacing whatever DNS record previously answered at that exact hostname. Otherwise the domain does not serve traffic until the owner adds the returned CNAME record at their DNS provider; use domains.verify afterwards to check. Once live it can serve short links, a funnel or site, and invoices at the same time.

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
domainstringrequiredThe hostname to connect, e.g. 'go.acme.com'. A full URL is accepted and trimmed.
labelstringoptionalAn internal note shown in pickers, e.g. 'ad traffic'. Not public.

Example

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

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

Disconnect

domains.disconnectwriteconfirmadmin only

Stop serving a domain and release its certificate. Every short link, funnel page and invoice published on it stops working immediately and falls back to the platform's own address. Link names are unique platform-wide on that shared address, so a link whose name is already taken there is renamed with a numeric suffix as it moves — its old URL stops working either way. If the domain's CNAME was created in the organization's own Cloudflare, that record is removed too. A domain BOUGHT through this platform stays registered to the organization — this only stops serving it, it does not give up the domain or refund anything.

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 domain's id, from domains.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/domains.disconnect \
  -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 domains_disconnect at https://app.chirply.io/api/mcp, same bearer token, same input.

Domain details

domains.getread

Read one domain: its status, how it was obtained, the DNS record required (if any), its expiry and auto-renew setting, and a breakdown of everything published on it.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe domain's id, from domains.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/domains.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 domains_get at https://app.chirply.io/api/mcp, same bearer token, same input.

Visitors can't reach this domain

domains.healthread

Read the stored reachability verdict for the account's custom domains — whether real HTTP requests to each hostname actually arrive at the platform, which Cloudflare's own status checks cannot see (a domain can show 'active' with a valid certificate while every visitor dies at the customer's misconfigured DNS proxy). Verdicts come from the automatic sweep that runs every few hours; a broken domain also carries plain-language fix steps. Reads stored state only — probes nothing and changes nothing.

Parameters

FieldTypeRequiredDescription
idstring (uuid)optionalOne domain's id (from domains.list); omit for every domain in the account.

Example

curl -X POST https://app.chirply.io/api/v1/actions/domains.health \
  -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 domains_health at https://app.chirply.io/api/mcp, same bearer token, same input.

Domains

domains.listread

List every custom domain this account has connected, with what is currently published on each one — the site or funnel at its root, how many short links point at it, and how many invoices are served from it. Includes whether each domain was bought through this platform or brought from another registrar, its DNS/certificate status, and its renewal date, plus the CNAME target a domain brought from elsewhere must point at — the white-label agency's own verified DNS hostname when one is set, otherwise the platform's.

Parameters

No parameters — POST an empty body.

Example

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

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

Public link host

domains.public_hostread

Show which hostname this account's customer-facing links are published on — short links, unsubscribe links, the opt-out page, booking and invoice pages — and why that host was chosen. The answer is this account's own connected domain with the app role if it has one, otherwise its parent agency's white-label domain, otherwise the platform host. Read-only; changes nothing, costs nothing, sends nothing. Use it to confirm what an agency's client's customer will actually see before a campaign goes out.

Parameters

No parameters — POST an empty body.

Example

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

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

Buy a domain

domains.purchasewriteconfirmadmin only

START buying a domain. THIS DOES NOT COMPLETE A PURCHASE and nothing is registered by this call: it prices the domain, creates a PENDING order, and puts an UNCAPTURED hold on a card in Stripe. No money is taken, the domain is NOT registered, and the organization does not own it when this returns — so do not report the domain as bought. Finishing requires a HUMAN in a browser at the returned /domains/buy link to confirm the card in Stripe's payment form, which no machine surface can do; that is what the returned requires_card_confirmation flag means. Only after that confirmation is the domain registered, the hold captured, and DNS configured automatically. Registration is non-refundable once it completes, and it renews yearly at the quoted renewal price unless auto-renew is turned off. Note the hold itself can reduce the card's available balance until it is captured or released.

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
domainstringrequiredThe exact domain to buy, e.g. 'acmeroofing.com'. Check it with domains.check_availability first.

Example

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

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

Remove

domains.remove_funnel_routewriteconfirmadmin only

Remove one funnel route from a custom domain. The funnel and all of its pages remain in this account, but every URL below this domain route stops working immediately until the route is added again.

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 that owns the route.
route_idstring (uuid)requiredThe domain funnel route to remove, from domains.get or domains.list.

Example

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

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

Find a domain

domains.searchread

Search for domain names that are available to buy, with the price the organization would pay. Read-only — nothing is reserved or charged. Returns first-year and yearly renewal prices, which often differ.

Parameters

FieldTypeRequiredDescription
querystringrequiredA word, phrase or full domain to look for, e.g. 'acme roofing' or 'acmeroofing.com'.
limitintegeroptionalHow many suggestions to return. Defaults to the maximum the registry will give for a search; only set this to ask for FEWER.

Example

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

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

Auto-renew

domains.set_auto_renewwriteconfirmadmin only

Turn yearly auto-renewal on or off for a domain bought through this platform. With it on, the organization's card is charged about 30 days before expiry at the current renewal price. With it OFF the domain will EXPIRE at the end of its term and everything published on it will stop working.

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 domain's id, from domains.list.
auto_renewbooleanrequiredTrue to renew yearly, false to let it expire at the end of the term.

Example

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

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

Set up DNS automatically

domains.setup_dnswriteconfirmadmin only

Create the CNAME for an already-connected domain inside the organization's OWN Cloudflare account (requires the cloudflare integration). WRITES to the organization's live DNS: any A/AAAA/CNAME record answering at that exact hostname is REPLACED with the platform CNAME, which changes where that hostname resolves for everyone on the internet. Touches only that one hostname, never the rest of the zone. Use on domains stuck 'Waiting for DNS' that were connected before Cloudflare was, or whose record was removed.

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 domain's id, from domains.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/domains.setup_dns \
  -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 domains_setup_dns at https://app.chirply.io/api/mcp, same bearer token, same input.

Domain settings

domains.updatewriteconfirmadmin only

Change what a domain does: which website answers at its root, where the bare domain redirects when nothing is attached, where unknown paths go, and whether short links are allowed on it. Additional funnels use domains.add_funnel_route. Turning links off instantly stops every short link on this domain from resolving.

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 domain's id, from domains.list.
funnel_idstring (uuid) (or null)optionalThe single website served at the domain root (/). Null detaches it. Add funnels below named paths with domains.add_funnel_route.
labelstring (or null)optionalInternal note shown in pickers.
root_redirect_urlstring (or null)optionalWhere https://the-domain/ sends visitors when no site is attached.
not_found_urlstring (or null)optionalWhere an unknown path goes instead of a 404 page.
links_enabledbooleanoptionalWhether short links resolve on this domain. Setting false immediately breaks every link on it.

Example

curl -X POST https://app.chirply.io/api/v1/actions/domains.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 domains_update at https://app.chirply.io/api/mcp, same bearer token, same input.

Check again

domains.verifywriteadmin only

Re-check a domain's DNS and certificate with Cloudflare and store the result. Safe to call repeatedly; changes nothing except the recorded status. Owners and admins only, matching the button on /domains.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe domain's id, from domains.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/domains.verify \
  -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 domains_verify at https://app.chirply.io/api/mcp, same bearer token, same input.

Attach a pixel

pixels.attachwriteconfirmadmin only

Attach or detach a pixel from one specific link, funnel, page or invoice. Attaching starts firing it for real visitors to that live surface immediately, and on a SHORT LINK it also FORCES THE INTERSTITIAL PAGE ON — a link that used to redirect straight through now shows a page first, which changes what every existing recipient of that link experiences. Detaching stops the pixel there and the audience it was building stops growing. Not needed for pixels marked all_surfaces — those already fire everywhere.

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 pixel's id, from pixels.list.
surface_type"link" | "funnel" | "funnel_page" | "invoice" | "receipt" | "form" | … 1 morerequiredWhich kind of thing this is attached to.
surface_idstring (uuid)requiredThe id of the link, funnel, page or invoice.
attachedbooleanrequiredTrue to attach, false to detach.

Example

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

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

Where a pixel fires

pixels.attachmentsread

List everything one pixel is currently attached to.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe pixel's id, from pixels.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/pixels.attachments \
  -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 pixels_attachments at https://app.chirply.io/api/mcp, same bearer token, same input.

Add a pixel

pixels.createwriteconfirmadmin only

Add a retargeting pixel. THIS PUTS THIRD-PARTY TRACKING CODE ON LIVE PUBLIC PAGES that real visitors load, and it starts collecting their behaviour for the ad platform the moment it is live — so it is a privacy and consent decision, not just a setting. For a known provider give the ID from their ads manager and the snippet is generated safely; for anything else use provider 'custom', which injects the RAW SNIPPET verbatim and will run whatever JavaScript it contains. Setting all_surfaces fires it on every public page the organization serves — every funnel, link interstitial and invoice pay page at once — which is usually what's wanted. Attaching a pixel to a short link forces that link's interstitial page on, because a bare redirect renders no page for a pixel to fire on.

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
namestringrequiredAn internal name, e.g. 'Meta — main ad account'.
provider"facebook" | "google_ads" | "google_analytics" | "tiktok" | "linkedin" | "pinterest" | … 4 morerequiredThe ad platform. Use 'custom' to paste a raw snippet from anywhere else.
pixel_idstringoptionalThe provider's own ID, e.g. a Meta pixel ID. Required unless provider is 'custom'.
custom_htmlstringoptionalThe raw snippet, including <script> tags. Required when provider is 'custom'.
placement"head" | "body"optionalWhere the snippet is injected — 'head' for most tags, 'body' for ones that must render late.
all_surfacesbooleanoptionalFire on every public page without attaching it one at a time. Defaults to false.

Example

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

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

Delete a pixel

pixels.deletewriteconfirmadmin only

Delete a pixel and remove it from everything it was attached to. It stops firing immediately and the audience it was building stops growing.

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 pixel's id, from pixels.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/pixels.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 pixels_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Pixels

pixels.listread

List the organization's retargeting pixels. A pixel is defined once and can fire on any public surface — link interstitials, funnel pages, invoice pay pages — either everywhere or only where attached.

Parameters

No parameters — POST an empty body.

Example

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

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

Edit a pixel

pixels.updatewriteconfirmadmin only

Change a pixel's name, ID, snippet, placement, or whether it fires on every public page. Every change takes effect on LIVE public pages on the next page load: replacing custom_html swaps the JavaScript running in real visitors' browsers, and turning all_surfaces on starts firing it across every funnel, link interstitial and invoice pay page the organization serves. Pointing it at a different pixel ID sends visitor data to a different ad account.

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 pixel's id, from pixels.list.
namestringoptionalNew internal name.
pixel_idstring (or null)optionalNew provider ID.
custom_htmlstring (or null)optionalNew raw snippet, for custom pixels.
placement"head" | "body"optionalWhere the snippet is injected — 'head' for most tags, 'body' for ones that must render late.
all_surfacesbooleanoptionalWhether it fires on every public page.

Example

curl -X POST https://app.chirply.io/api/v1/actions/pixels.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 pixels_update at https://app.chirply.io/api/mcp, same bearer token, same input.

Attach a tracking script

scripts.attachwriteconfirmadmin only

Attach or detach a tracking script from one specific link, funnel, page or invoice. Attaching STARTS RUNNING THAT JAVASCRIPT in real visitors' browsers on that live page from the next page load; detaching stops it and anything it was measuring stops being recorded. Not needed for scripts marked all_surfaces.

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 script's id, from scripts.list.
surface_type"link" | "funnel" | "funnel_page" | "invoice" | "receipt" | "form" | … 1 morerequiredWhich kind of thing this is attached to.
surface_idstring (uuid)requiredThe id of the link, funnel, page or invoice.
attachedbooleanrequiredTrue to attach, false to detach.

Example

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

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

Add a tracking script

scripts.createwriteconfirmadmin only

Add a tracking snippet that runs on the organization's public pages. The snippet executes in visitors' browsers on pages the organization controls. Setting all_surfaces runs it on every public page. Maximum 8000 characters.

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
namestringrequiredAn internal name, e.g. 'Google Tag Manager'.
htmlstringrequiredThe full snippet, including <script> tags, exactly as the provider gave it.
placement"head" | "body"optionalWhere the snippet is injected — 'head' for most tags, 'body' for ones that must render late.
activebooleanoptionalWhether it runs. Defaults to true.
all_surfacesbooleanoptionalRun on every public page. Defaults to false.

Example

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

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

Delete a tracking script

scripts.deletewriteconfirmadmin only

Delete a tracking script and remove it from everything it was attached to. It stops running immediately, and anything it was measuring stops being recorded.

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 script's id, from scripts.list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/scripts.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 scripts_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Tracking scripts

scripts.listread

List the organization's tracking scripts — Google Tag Manager, heatmaps, chat widgets, affiliate tags. Defined once and reusable on any public page, rather than pasted into each invoice or funnel separately.

Parameters

No parameters — POST an empty body.

Example

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

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

Edit a tracking script

scripts.updatewriteconfirmadmin only

Change a tracking script's name, snippet, placement, or whether it's active. Setting active to false stops it running everywhere at once.

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 script's id, from scripts.list.
namestringoptionalNew internal name.
htmlstringoptionalNew snippet, including <script> tags.
placement"head" | "body"optionalWhere the snippet is injected — 'head' for most tags, 'body' for ones that must render late.
activebooleanoptionalWhether it runs at all.
all_surfacesbooleanoptionalWhether it runs on every public page.

Example

curl -X POST https://app.chirply.io/api/v1/actions/scripts.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 scripts_update 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=domains — same operations, with full JSON Schemas. Authentication, errors and rate limits are covered in the API documentation home.