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.
Recent clicks
links.clicksread
The most recent individual clicks on a link — when, from which country and city, on what device and browser, where they came from, and whether they were sent through or stopped by a rule.
Over MCP the same operation is the tool links_clicks at https://app.chirply.io/api/mcp, same bearer token, same input.
Connect a domain
links.connect_domainwriteconfirmadmin only
DEPRECATED — use domains.connect, which writes the same rows and is the maintained version. Registers a domain the organization owns so links and pages can be served on it. Creates a Cloudflare custom hostname and starts certificate issuance; the domain will NOT serve anything until the owner adds a CNAME record at their DNS provider and the certificate is issued. Nothing is charged, but this claims the hostname on the platform's Cloudflare zone.
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
Field
Type
Required
Description
domain
string
required
The hostname to connect, e.g. 'go.acme.com'. No scheme, no path.
Over MCP the same operation is the tool links_connect_domain at https://app.chirply.io/api/mcp, same bearer token, same input.
Create a link
links.createwrite
Create a link and return its public URL. Costs nothing and sends nothing — the link is live immediately but nobody sees it until it is shared. Leave the name blank for a short random one. Leave domain_id blank to host it on the platform's own short address; supply one of the organization's connected domains to brand it. Rotating, sticky and overflow links need `targets`; a file link needs a file URL. To turn one natural-language brief into both an opt-in link and an AI-designed editable page, use links.generate_optin_page instead.
What the link does. 'short' sends everyone to one place. 'rotating' splits traffic between several destinations; 'sticky' does the same but a returning visitor keeps their original destination; 'overflow' fills each destination up to its own click cap before moving to the next. 'group' is a folder that reports on its child links. 'file' serves an uploaded file. 'optin' shows an email-capture form first and creates a CRM contact. 'bio' renders a link-in-bio profile page. 'untracked' is a plain redirect with NO click logging at all. Default: "short"
destination
string
optional
Where the link sends people. Required for every kind except group, bio and file.
slug
string
optional
The part after the slash, e.g. 'spring-sale'. Random if omitted. This IS the public URL: changing it on an existing link 404s every copy already shared, printed or sent.
domain_id
string (uuid) (or null)
optional
A connected domain to host the link on. Null = the platform's own short address.
parent_id
string (uuid) (or null)
optional
The id of a kind='group' link to file this one under. The group reports the combined clicks and conversions of everything inside it; the child keeps its own URL and its own report.
title
string
optional
An internal label for lists and reports. Visitors never see it — not on the page, not in the browser tab, not in a share card. Set `preview` to control what the public sees when the link is posted somewhere.
notes
string
optional
Private notes.
tags
string[]
optional
Tags for grouping links.
status
"active" | "paused" | "archived"
optional
'active' resolves normally; 'paused' and 'archived' stop the link dead — visitors get a not-found page.
targets
object[]
optional
Destinations for a rotating, sticky or overflow link.
targets[].url
string
required
Where this destination sends people.
targets[].label
string
optional
A name for this destination, for reports.
targets[].weight
integer
optional
Share of traffic relative to the other destinations. Two at 1 each split evenly; one at 3 against one at 1 takes three quarters. Ignored by overflow links.
targets[].cap
integer (or null)
optional
Overflow links only: how many clicks this destination absorbs before traffic spills into the next one.
targets[].active
boolean
optional
Set false to skip this destination.
password
string
optional
Visitors must type this before the link works. Omit for none.
starts_at
string (date-time)
optional
ISO 8601 timestamp before which the link doesn't work yet.
expires_at
string (date-time)
optional
ISO 8601 timestamp after which the link stops working.
expired_url
string
optional
Where expired traffic goes. Omit to show a plain message instead.
max_clicks
integer
optional
Stop resolving after this many clicks.
strip_fbclid
boolean
optional
Remove the `fbclid` parameter Facebook appends before forwarding.
forward_query
boolean
optional
Pass the visitor's query string on to the destination. Default true.
redirect_code
integer
optional
301 or 302. 301 is cached by browsers forever — later destination changes may not reach people who already clicked.
schedule
map of string → object
optional
Different destinations on different days. {"days":{"mon":"https://…"},"dates":{"2026-12-25":"https://…"},"timezone":"America/New_York"}. An exact date beats a weekday.
geo
map of string → object
optional
Country rules. {"mode":"off|allow|deny|route","countries":{"US":{"url":"https://…"}},"blockedUrl":"https://…"}. allow = only these countries get through; deny = these are blocked; route = everyone gets through but these go elsewhere.
Overrides the social share card. {"enabled":true,"title":"…","description":"…","image":"https://…"}.
interstitial
map of string → object
optional
The branded waiting page. {"enabled":true,"seconds":5,"headline":"…","message":"…","logoUrl":"…","color":"#1155cc"}. Forced on whenever a retargeting pixel is attached, because that page is the only place a pixel can fire.
optin
map of string → object
optional
Opt-in gate configuration for kind=optin. {"headline":"…","message":"…","buttonLabel":"…","fields":{"name":{"show":true,"required":false},"phone":{"show":false}},"tags":["newsletter"],"disclaimer":"…","color":"#1155cc","design":{"mode":"basic|builder","funnelId":"uuid","pageId":"uuid"},"confirmation":{"enabled":true,"method":"link|code","channels":["email","phone"],"emailIdentityId":"uuid (optional)","phoneNumberId":"uuid (optional)","subject":"Confirm your signup","message":"…","buttonLabel":"Confirm","smsMessage":"…","pendingMessage":"…"}}. The basic design is built in; use links.design_optin_page to safely create builder ids for an existing link, or links.generate_optin_page to create the link and AI-designed builder draft together from one brief. Email is always collected. Double opt-in uses exactly one method and delivers it by email, SMS, or both. Omitted sender IDs use account defaults; explicit IDs must be ready/active account senders. Delivery sends real messages through the account providers and incurs their normal cost. No CRM contact, source tags, conversion, or automation is created until verification succeeds.
bio
map of string → object
optional
Bio page contents for kind=bio. {"heading":"…","tagline":"…","avatarUrl":"…","theme":"light|dark","color":"#1155cc","buttons":[{"label":"…","url":"…"}],"socials":[{"network":"instagram","url":"…"}]}.
file
map of string → object
optional
The file a kind=file link serves. {"url":"https://…","name":"guide.pdf","download":true}. Uploading a file is UI-only; supply a URL here.
Over MCP the same operation is the tool links_create at https://app.chirply.io/api/mcp, same bearer token, same input.
Add a retargeting pixel
links.create_pixelwriteconfirmadmin only
DEPRECATED — use pixels.create, which writes the same rows and is the maintained version. Adds a retargeting pixel that can be attached to links. Supply the provider's own ID (from Meta Events Manager, Google Ads, and so on) — the snippet is generated from it. Use provider 'custom' with `custom_html` for anything else, which injects THAT HTML VERBATIM INTO A PUBLIC PAGE every visitor passing through the link loads: it is arbitrary third-party JavaScript running on the organization's own branded domain, and there is no review step. `scripts.create` is confirmed for exactly this payload.
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.
Over MCP the same operation is the tool links_create_pixel at https://app.chirply.io/api/mcp, same bearer token, same input.
Add a traffic seller
links.create_vendorwrite
Add someone this organization buys clicks from. Assign them to a link (with clicks_ordered and order_amount) to see how much of what was paid for actually arrived.
Over MCP the same operation is the tool links_create_vendor at https://app.chirply.io/api/mcp, same bearer token, same input.
Delete a link
links.deletewriteconfirm
Permanently delete a link, along with every click and conversion recorded against it. Anyone who already has the link gets a not-found page from then on. This cannot be undone — pause the link instead if you only want to stop it temporarily.
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.
Over MCP the same operation is the tool links_delete at https://app.chirply.io/api/mcp, same bearer token, same input.
Delete a retargeting pixel
links.delete_pixelwriteconfirmadmin only
DEPRECATED — use pixels.delete, which deletes the same rows and is the maintained version. Permanently deletes a retargeting pixel and removes it from every link it was attached to. Those links stop building that audience from the next click on. This cannot be undone.
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.
Over MCP the same operation is the tool links_delete_pixel at https://app.chirply.io/api/mcp, same bearer token, same input.
Delete a traffic seller
links.delete_vendorwriteconfirm
Permanently delete a traffic seller. Links assigned to them keep working and keep their ordered-click figures, but are no longer grouped under anyone. This cannot be undone.
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.
Over MCP the same operation is the tool links_delete_vendor at https://app.chirply.io/api/mcp, same bearer token, same input.
Design in Page Builder
links.design_optin_pagewrite
Create or reopen the dedicated drag-and-drop page for an opt-in link. This uses one page/funnel slot when first created, sends no messages, and does not change what visitors see until the page is published. The visual page controls layout and content while LinkWizard continues to control captured details, verification, account senders, tags, automations, and the final destination.
Parameters
Field
Type
Required
Description
id
string (uuid)
required
The opt-in link whose visual page should be created or opened.
Over MCP the same operation is the tool links_design_optin_page at https://app.chirply.io/api/mcp, same bearer token, same input.
Duplicate a link
links.duplicatewrite
Copy a link with all of its rules and destinations under a fresh random name. The copy is created PAUSED on purpose — an exact duplicate that went live immediately would start splitting traffic with the original before anything had been changed. Retargeting pixels are not copied.
Over MCP the same operation is the tool links_duplicate at https://app.chirply.io/api/mcp, same bearer token, same input.
Turn on conversion tracking
links.enable_trackingwriteconfirm
Switch on full-loop conversion tracking and return the one script to install. Once on, every tracked link appends a small `cwc` parameter to the DESTINATION URL — the organization's live public links start carrying an extra query parameter to whatever site they point at, which some destinations reject or log. THERE IS NO CAPABILITY TO TURN THIS BACK OFF: once an account has a tracker it keeps it, so this is one-way from the machine surfaces. Safe to call repeatedly — it returns the existing token if there is one.
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.
Over MCP the same operation is the tool links_enable_tracking at https://app.chirply.io/api/mcp, same bearer token, same input.
Build opt-in with AI
links.generate_optin_pagewriteconfirm
Create a working LinkWizard opt-in link and an AI-designed, fully editable Page Builder draft from one plain-language brief. The link itself is active immediately and its built-in fallback form works, but the AI design does NOT replace that fallback until a human publishes the builder page. This SPENDS MONEY — the generation is billed to the organization's own AI provider key — and it uses one page/funnel slot against the plan's limit. It sends no messages and applies no tags or automations until a real visitor submits the form.
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
Field
Type
Required
Description
prompt
string
required
Describe the offer, audience, desired look and conversion goal in plain language. The AI writes and lays out an opt-in page from this brief.
destination
string
required
Full URL visitors should reach after they submit and complete any required verification, such as https://example.com/guide.
slug
string
optional
Preferred public link name after the slash. A short random name is used if omitted.
domain_id
string (uuid) (or null)
optional
Active connected domain that should host the link. Null or omitted uses the platform's own short-link domain.
title
string
optional
Internal name shown in LinkWizard. If omitted, the opening sentence of the brief is used.
tags
string[]
optional
CRM tags to apply when a visitor successfully completes the opt-in.
collect_name
boolean
optional
Show a name field on the form. Default: true
require_name
boolean
optional
Require the name field. Ignored when collect_name is false. Default: false
collect_phone
boolean
optional
Show a phone field on the form in addition to the always-required email field. Default: false
require_phone
boolean
optional
Require the phone field. Ignored when collect_phone is false. Default: false
disclaimer
string
optional
Consent or privacy text displayed beside the form submission control.
Over MCP the same operation is the tool links_get at https://app.chirply.io/api/mcp, same bearer token, same input.
Cross-account contact sharing
links.get_contact_sharingread
Whether this account lets OTHER accounts read contact context for people it sent to them on a tracked link, and which accounts may do it. Relevant when this account's contacts click through to a landing page somebody else owns — an affiliate or partner arrangement. Off by default. Read-only.
Over MCP the same operation is the tool links_get_contact_sharing at https://app.chirply.io/api/mcp, same bearer token, same input.
Conversion tracking snippet
links.get_trackingread
The organization's conversion-tracking state, every website it tracks with the script tag for each, and the custom event names already seen. There is ONE script (`/embed/t.js`) which does visitor tracking and conversions together — there is no separate conversion-only snippet any more — but each website carries its OWN key, because that key is what scopes the site's origin allow-list and keeps one site's visitors out of another's reports. So `sites` is a list and there is deliberately no one default snippet: handing out one site's key for a different site produces beacons the origin allow-list refuses. Returns nothing configured if tracking has never been switched on.
Over MCP the same operation is the tool links_get_tracking at https://app.chirply.io/api/mcp, same bearer token, same input.
List links
links.listread
List the organization's links, newest first, with their click, unique-visitor and conversion counts. Optionally filter by kind, status, domain or tag, and search the name, label and destination.
What the link does. 'short' sends everyone to one place. 'rotating' splits traffic between several destinations; 'sticky' does the same but a returning visitor keeps their original destination; 'overflow' fills each destination up to its own click cap before moving to the next. 'group' is a folder that reports on its child links. 'file' serves an uploaded file. 'optin' shows an email-capture form first and creates a CRM contact. 'bio' renders a link-in-bio profile page. 'untracked' is a plain redirect with NO click logging at all.
status
"active" | "paused" | "archived"
optional
'active' resolves normally; 'paused' and 'archived' stop the link dead — visitors get a not-found page.
domain_id
string (uuid)
optional
Only links on this connected domain.
tag
string
optional
Only links carrying this tag.
query
string
optional
Text to match in the link name, label or destination.
Over MCP the same operation is the tool links_list at https://app.chirply.io/api/mcp, same bearer token, same input.
List retargeting pixels
links.list_pixelsread
DEPRECATED — use pixels.list, which reads the same rows and is the maintained version. Lists the retargeting pixels set up for this organization, ready to attach to links.
Over MCP the same operation is the tool links_overview at https://app.chirply.io/api/mcp, same bearer token, same input.
Who a link was sent to
links.recipientsread
The people this link was sent to individually, and which of them opened it — highest engagement first. Only populated when per-person link tracking is on: each recipient of an email or text gets their own copy of the link, so a click can be attributed to a named contact rather than an anonymous visitor.
Over MCP the same operation is the tool links_recipients at https://app.chirply.io/api/mcp, same bearer token, same input.
Share contacts with partner sites
links.set_contact_sharingwriteconfirmadmin only
Let other accounts read the CRM context — name, email, tags, deals, messages, and call transcripts — of a contact of yours who clicked one of your tracked links onto THEIR landing page. This discloses your own customers' personal data to another business: they can use it to personalize the page that contact lands on. It never works in reverse, only applies to contacts who actually clicked one of your links, and turning it off takes effect immediately for every future request. Leave `destination_org_ids` empty to allow any destination (the usual choice for a public affiliate program); list account ids to restrict it to a named few.
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
Field
Type
Required
Description
enabled
boolean
required
true lets permitted destination accounts read your contacts' context; false stops it for every future request.
destination_org_ids
array of (string (uuid))
optional
The only accounts allowed to read it. Omit or pass an empty list to allow any site your tracked links point at.
Over MCP the same operation is the tool links_set_contact_sharing at https://app.chirply.io/api/mcp, same bearer token, same input.
Domain for tracking links
links.set_link_domainwriteconfirmadmin only
Choose which connected domain rewritten tracking links go out on, instead of Chirply's own short host. Affects links minted from now on; links already sent keep resolving on the domain they went out with. `match_sending_domain` additionally puts each link on whichever connected domain shares a registrable domain with the address the message is actually sent from (so mail from hello@acme.com gets links on go.acme.com), falling back to `domain_id` when there is no match or the sender is not known yet — a link domain that does not match the From address reads as a forwarding service to mailbox providers, which costs deliverability.
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
Field
Type
Required
Description
domain_id
string (uuid) (or null)
optional
The connected domain to mint tracking links on. Pass null (or omit) for Chirply's short host. Must be a domain this account has connected.
match_sending_domain
boolean
optional
Prefer a connected domain matching the sender's own domain, falling back to domain_id. Leave on unless links must always use one fixed domain. Default: true
Over MCP the same operation is the tool links_set_link_domain at https://app.chirply.io/api/mcp, same bearer token, same input.
Turn per-person links on or off
links.set_link_rewritingwriteconfirmadmin only
Switch per-person link rewriting for the whole account. When ON, every link inside outgoing emails and texts is rewritten so each recipient gets their own URL — clicks then carry the contact's identity, and so do any conversions they produce. All recipients still share ONE link, so editing where it points changes every message already delivered. Unsubscribe links are never rewritten. Turning it OFF does not break links already sent; it only stops new ones being minted. Switching it on also enables conversion tracking, which adds a `cwc` parameter to destination URLs, and every click on a rewritten link stamps a signed `ct` parameter naming the recipient onto the destination — that is what lets a landing page running the Chirply tracking script recognise which contact just arrived.
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
Field
Type
Required
Description
enabled
boolean
required
true rewrites links in outgoing messages; false stops.
Over MCP the same operation is the tool links_set_link_rewriting at https://app.chirply.io/api/mcp, same bearer token, same input.
Choose which pixels fire on a link
links.set_pixelswriteconfirmadmin only
DEPRECATED — use pixels.attach, which writes the same rows and is the maintained version. Sets exactly which retargeting pixels fire on a link, replacing whatever was attached before. This changes what a LIVE public link does: attaching any pixel forces the link to show its short branded waiting page — that page is the only moment a pixel can fire on a click passing through to somebody else's site — and it starts running that pixel's third-party JavaScript for every visitor.
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
Field
Type
Required
Description
id
string (uuid)
required
The link to change.
pixel_ids
array of (string (uuid))
required
The complete list of pixels for this link. An empty array removes them all.
Over MCP the same operation is the tool links_set_pixels at https://app.chirply.io/api/mcp, same bearer token, same input.
Pause or resume a link
links.set_statuswriteconfirm
Set a link live, paused or archived. A paused link stops resolving immediately — everyone who opens it, including people who already have it, gets a not-found page.
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
Field
Type
Required
Description
id
string (uuid)
required
The link to change.
status
"active" | "paused" | "archived"
required
'active' resolves normally; 'paused' and 'archived' stop the link dead — visitors get a not-found page.
Over MCP the same operation is the tool links_set_status at https://app.chirply.io/api/mcp, same bearer token, same input.
Link report
links.statsread
Click and conversion statistics for one link over a window of days: totals, unique visitors, blocked clicks, conversions and their value, a per-day series, and rankings by country, device, browser, operating system and referring site.
Over MCP the same operation is the tool links_stats at https://app.chirply.io/api/mcp, same bearer token, same input.
Edit a link
links.updatewriteconfirm
Update any field on an existing link. Omitted fields are left alone. THREE OF THESE FIELDS REACH THE PUBLIC IMMEDIATELY. `slug` and `domain_id` change the link's public URL, so every copy already shared, printed, emailed or posted to an ad platform starts returning a not-found page. `status` is the same write `links.set_status` gates: 'paused' or 'archived' kills the link dead for everyone holding it. And supplying `targets` REPLACES the whole destination list, which resets the per-destination click counts that overflow caps rely on. None of that can be undone by editing the field back — traffic lost in the meantime is gone.
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.
What the link does. 'short' sends everyone to one place. 'rotating' splits traffic between several destinations; 'sticky' does the same but a returning visitor keeps their original destination; 'overflow' fills each destination up to its own click cap before moving to the next. 'group' is a folder that reports on its child links. 'file' serves an uploaded file. 'optin' shows an email-capture form first and creates a CRM contact. 'bio' renders a link-in-bio profile page. 'untracked' is a plain redirect with NO click logging at all.
destination
string (or null)
optional
Where the link sends people. Required for every kind except group, bio and file.
slug
string
optional
The part after the slash, e.g. 'spring-sale'. Random if omitted. This IS the public URL: changing it on an existing link 404s every copy already shared, printed or sent.
domain_id
string (uuid) (or null)
optional
A connected domain to host the link on. Null = the platform's own short address.
parent_id
string (uuid) (or null)
optional
The id of a kind='group' link to file this one under. The group reports the combined clicks and conversions of everything inside it; the child keeps its own URL and its own report.
title
string (or null)
optional
An internal label for lists and reports. Visitors never see it — not on the page, not in the browser tab, not in a share card. Set `preview` to control what the public sees when the link is posted somewhere.
notes
string (or null)
optional
Private notes.
tags
string[]
optional
Tags for grouping links.
status
"active" | "paused" | "archived"
optional
'active' resolves normally; 'paused' and 'archived' stop the link dead — visitors get a not-found page.
targets
object[]
optional
Destinations for a rotating, sticky or overflow link.
targets[].url
string
required
Where this destination sends people.
targets[].label
string
optional
A name for this destination, for reports.
targets[].weight
integer
optional
Share of traffic relative to the other destinations. Two at 1 each split evenly; one at 3 against one at 1 takes three quarters. Ignored by overflow links.
targets[].cap
integer (or null)
optional
Overflow links only: how many clicks this destination absorbs before traffic spills into the next one.
targets[].active
boolean
optional
Set false to skip this destination.
password
string (or null)
optional
Visitors must type this before the link works. Omit for none.
starts_at
string (date-time) (or null)
optional
ISO 8601 timestamp before which the link doesn't work yet.
expires_at
string (date-time) (or null)
optional
ISO 8601 timestamp after which the link stops working.
expired_url
string (or null)
optional
Where expired traffic goes. Omit to show a plain message instead.
max_clicks
integer (or null)
optional
Stop resolving after this many clicks.
strip_fbclid
boolean
optional
Remove the `fbclid` parameter Facebook appends before forwarding.
forward_query
boolean
optional
Pass the visitor's query string on to the destination. Default true.
redirect_code
integer
optional
301 or 302. 301 is cached by browsers forever — later destination changes may not reach people who already clicked.
schedule
map of string → object
optional
Different destinations on different days. {"days":{"mon":"https://…"},"dates":{"2026-12-25":"https://…"},"timezone":"America/New_York"}. An exact date beats a weekday.
geo
map of string → object
optional
Country rules. {"mode":"off|allow|deny|route","countries":{"US":{"url":"https://…"}},"blockedUrl":"https://…"}. allow = only these countries get through; deny = these are blocked; route = everyone gets through but these go elsewhere.
Overrides the social share card. {"enabled":true,"title":"…","description":"…","image":"https://…"}.
interstitial
map of string → object
optional
The branded waiting page. {"enabled":true,"seconds":5,"headline":"…","message":"…","logoUrl":"…","color":"#1155cc"}. Forced on whenever a retargeting pixel is attached, because that page is the only place a pixel can fire.
optin
map of string → object
optional
Opt-in gate configuration for kind=optin. {"headline":"…","message":"…","buttonLabel":"…","fields":{"name":{"show":true,"required":false},"phone":{"show":false}},"tags":["newsletter"],"disclaimer":"…","color":"#1155cc","design":{"mode":"basic|builder","funnelId":"uuid","pageId":"uuid"},"confirmation":{"enabled":true,"method":"link|code","channels":["email","phone"],"emailIdentityId":"uuid (optional)","phoneNumberId":"uuid (optional)","subject":"Confirm your signup","message":"…","buttonLabel":"Confirm","smsMessage":"…","pendingMessage":"…"}}. The basic design is built in; use links.design_optin_page to safely create builder ids for an existing link, or links.generate_optin_page to create the link and AI-designed builder draft together from one brief. Email is always collected. Double opt-in uses exactly one method and delivers it by email, SMS, or both. Omitted sender IDs use account defaults; explicit IDs must be ready/active account senders. Delivery sends real messages through the account providers and incurs their normal cost. No CRM contact, source tags, conversion, or automation is created until verification succeeds.
bio
map of string → object
optional
Bio page contents for kind=bio. {"heading":"…","tagline":"…","avatarUrl":"…","theme":"light|dark","color":"#1155cc","buttons":[{"label":"…","url":"…"}],"socials":[{"network":"instagram","url":"…"}]}.
file
map of string → object
optional
The file a kind=file link serves. {"url":"https://…","name":"guide.pdf","download":true}. Uploading a file is UI-only; supply a URL here.
Over MCP the same operation is the tool links_update at https://app.chirply.io/api/mcp, same bearer token, same input.
Change a domain's settings
links.update_domainwriteconfirmadmin only
DEPRECATED — use domains.update, which writes the same rows and is the maintained version. Sets what a connected domain serves: which funnel or single page is attached, where the bare domain redirects when nothing is attached, where unknown addresses go, and whether links are allowed on it at all. This reconfigures a LIVE public hostname: setting links_enabled false immediately stops every link hosted there from resolving, for everyone already holding one, and repointing funnel_id changes what the world sees at that address.
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
Field
Type
Required
Description
id
string (uuid)
required
The connected domain to change.
funnel_id
string (uuid) (or null)
optional
The funnel or single page served at the root of this domain. Null for links only.
root_redirect_url
string (or null)
optional
Where the bare domain sends people when no funnel is attached.
not_found_url
string (or null)
optional
Where an unknown address on this domain sends people instead of showing a not-found page.