13 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 a widget agent
widgets.add_agentwriteadmin only
Add someone for a widget to ring: either a team member (rung through their browser softphone) or an arbitrary phone number. Agents are rung in the order they were added when the dial strategy is sequential.
Parameters
Field
Type
Required
Description
widget_id
string (uuid)
required
The widget to add the agent to.
kind
"seat" | "number"
optional
'seat' rings a team member's softphone; 'number' rings a PSTN number. Default: "seat"
user_id
string (uuid)
optional
The team member to ring. Required when kind is 'seat'.
external_e164
string
optional
The phone number to ring. Required when kind is 'number'.
phone_number_id
string (uuid)
optional
Which of the org's numbers to place the call from.
Over MCP the same operation is the tool widgets_add_agent at https://app.chirply.io/api/mcp, same bearer token, same input.
Allow a site
widgets.add_originwriteadmin only
Allow a website to embed a widget. The widget only renders (and its public config API only responds) on origins in this list, so add every host it should appear on — apex, www and staging.
Parameters
Field
Type
Required
Description
widget_id
string (uuid)
required
The widget to allow the site for.
origin
string
required
The site, e.g. "https://www.acme.com". A bare host is assumed to be https.
Over MCP the same operation is the tool widgets_add_origin at https://app.chirply.io/api/mcp, same bearer token, same input.
Create a widget
widgets.createwriteadmin only
Create a draft click-to-call widget with default copy and weekday 9–5 availability, and mint its public embed key. It renders nowhere until you add allowed sites and publish it.
Over MCP the same operation is the tool widgets_create at https://app.chirply.io/api/mcp, same bearer token, same input.
Delete a widget
widgets.deletewriteconfirmadmin only
PERMANENTLY DESTROY a widget along with its schedule, agent routing, allowed origins and visitor session history. Any embed snippet still installed on the tenant's site stops working. 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 widgets_delete at https://app.chirply.io/api/mcp, same bearer token, same input.
Get the embed snippet
widgets.embed_snippetread
Get the one-line script tag that installs a CLICK-TO-CALL widget — paste it into the site's HTML just before </body> — plus the widget's standalone iframe URL. The button only appears on origins added with widgets.add_origin. This returns the click-to-call loader (/embed/w.js and /w/<key>); a live-chat widget needs a DIFFERENT loader and would be inert with this one, so a chat widget's id returns not-found here — use live_chat.embed_snippet for those.
Over MCP the same operation is the tool widgets_embed_snippet at https://app.chirply.io/api/mcp, same bearer token, same input.
Open a widget
widgets.getread
Fetch one CLICK-TO-CALL widget with everything its builder shows: behavior and appearance settings, business hours, the agents it rings, the sites it's allowed to appear on, and the embed snippet. Click-to-call only — a live-chat widget's id returns not-found here, because its settings are a different shape entirely; read those with live_chat.get_widget.
Over MCP the same operation is the tool widgets_get at https://app.chirply.io/api/mcp, same bearer token, same input.
List click-to-call widgets
widgets.listread
List the organization's embeddable click-to-call widgets — the floating button that rings agents and bridges a website visitor without exposing anyone's number.
Over MCP the same operation is the tool widgets_list at https://app.chirply.io/api/mcp, same bearer token, same input.
Publish a widget
widgets.publishwriteconfirmadmin only
MAKE THIS WIDGET LIVE ON THE TENANT'S WEBSITE. Once published, the embed snippet renders the floating button to real visitors on every allowed origin, and a visitor pressing it will originate real calls or texts to the configured agents. Add allowed sites first — an unpublished or origin-less widget renders nowhere.
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 widgets_remove_agent at https://app.chirply.io/api/mcp, same bearer token, same input.
Remove an allowed site
widgets.remove_originwriteconfirmadmin only
Stop a widget from rendering on a site. THIS BREAKS A WORKING INSTALL: the button vanishes from that website for real visitors on the loader's next refresh — the embed snippet is still in their HTML, so it looks installed and simply does nothing — and its public config API stops answering for that origin. Visitors on that site can no longer request a call or text. Re-adding the origin with widgets.add_origin 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.
Over MCP the same operation is the tool widgets_remove_origin at https://app.chirply.io/api/mcp, same bearer token, same input.
Set widget business hours
widgets.save_schedulewriteadmin only
Set the timezone and per-day availability window for a widget. Outside these hours the widget offers a scheduled callback instead of ringing agents.
Parameters
Field
Type
Required
Description
widget_id
string (uuid)
required
The widget whose hours to set.
timezone
string
required
IANA timezone, e.g. "America/New_York". Invalid values fall back to UTC.
hours
object
required
Business hours for all seven days.
hours.mon
object
required
One day's availability window, e.g. {"enabled":true,"start":"09:00","end":"17:00"}. While `enabled` is false, or outside start–end, the widget offers a scheduled callback instead of ringing anyone. Times are in the widget's own timezone, not the caller's.
hours.mon.enabled
boolean
required
Whether the widget takes calls that day.
hours.mon.start
string
required
Opening time in the widget timezone, "HH:MM" 24-hour.
hours.mon.end
string
required
Closing time in the widget timezone, "HH:MM" 24-hour.
hours.tue
object
required
One day's availability window, e.g. {"enabled":true,"start":"09:00","end":"17:00"}. While `enabled` is false, or outside start–end, the widget offers a scheduled callback instead of ringing anyone. Times are in the widget's own timezone, not the caller's.
hours.tue.enabled
boolean
required
Whether the widget takes calls that day.
hours.tue.start
string
required
Opening time in the widget timezone, "HH:MM" 24-hour.
hours.tue.end
string
required
Closing time in the widget timezone, "HH:MM" 24-hour.
hours.wed
object
required
One day's availability window, e.g. {"enabled":true,"start":"09:00","end":"17:00"}. While `enabled` is false, or outside start–end, the widget offers a scheduled callback instead of ringing anyone. Times are in the widget's own timezone, not the caller's.
hours.wed.enabled
boolean
required
Whether the widget takes calls that day.
hours.wed.start
string
required
Opening time in the widget timezone, "HH:MM" 24-hour.
hours.wed.end
string
required
Closing time in the widget timezone, "HH:MM" 24-hour.
hours.thu
object
required
One day's availability window, e.g. {"enabled":true,"start":"09:00","end":"17:00"}. While `enabled` is false, or outside start–end, the widget offers a scheduled callback instead of ringing anyone. Times are in the widget's own timezone, not the caller's.
hours.thu.enabled
boolean
required
Whether the widget takes calls that day.
hours.thu.start
string
required
Opening time in the widget timezone, "HH:MM" 24-hour.
hours.thu.end
string
required
Closing time in the widget timezone, "HH:MM" 24-hour.
hours.fri
object
required
One day's availability window, e.g. {"enabled":true,"start":"09:00","end":"17:00"}. While `enabled` is false, or outside start–end, the widget offers a scheduled callback instead of ringing anyone. Times are in the widget's own timezone, not the caller's.
hours.fri.enabled
boolean
required
Whether the widget takes calls that day.
hours.fri.start
string
required
Opening time in the widget timezone, "HH:MM" 24-hour.
hours.fri.end
string
required
Closing time in the widget timezone, "HH:MM" 24-hour.
hours.sat
object
required
One day's availability window, e.g. {"enabled":true,"start":"09:00","end":"17:00"}. While `enabled` is false, or outside start–end, the widget offers a scheduled callback instead of ringing anyone. Times are in the widget's own timezone, not the caller's.
hours.sat.enabled
boolean
required
Whether the widget takes calls that day.
hours.sat.start
string
required
Opening time in the widget timezone, "HH:MM" 24-hour.
hours.sat.end
string
required
Closing time in the widget timezone, "HH:MM" 24-hour.
hours.sun
object
required
One day's availability window, e.g. {"enabled":true,"start":"09:00","end":"17:00"}. While `enabled` is false, or outside start–end, the widget offers a scheduled callback instead of ringing anyone. Times are in the widget's own timezone, not the caller's.
hours.sun.enabled
boolean
required
Whether the widget takes calls that day.
hours.sun.start
string
required
Opening time in the widget timezone, "HH:MM" 24-hour.
hours.sun.end
string
required
Closing time in the widget timezone, "HH:MM" 24-hour.
Over MCP the same operation is the tool widgets_save_schedule at https://app.chirply.io/api/mcp, same bearer token, same input.
Unpublish a widget
widgets.unpublishwriteconfirmadmin only
Take a widget off the tenant's website. The button stops rendering for visitors and the public config API stops responding for it, even where the embed snippet is still installed. Configuration is 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.
Over MCP the same operation is the tool widgets_unpublish at https://app.chirply.io/api/mcp, same bearer token, same input.
Edit a widget
widgets.updatewriteadmin only
Update a widget's name, dialing behavior, which devices it shows on, and its appearance/copy settings. If the widget is published these changes are visible on the tenant's live site immediately. Omitted fields are left alone.
Parameters
Field
Type
Required
Description
id
string (uuid)
required
The widget to edit.
name
string
optional
New widget name (trimmed to 120 characters).
mode
"call" | "sms" | "both"
optional
What visitors can request: a call, a text, or both.
dial_strategy
"simulring" | "sequential"
optional
simulring rings every agent at once; sequential rings them in order.
ring_timeout_seconds
integer
optional
How long to ring before giving up. Clamped to 5–120 seconds.
view_type
"both" | "desktop" | "mobile" | "none"
optional
Which devices the launcher appears on.
settings
map of string → object
optional
Appearance and copy: logoUrl, primaryColor, accentColor, buttonLabel, buttonPosition, heading, description, smsBody, greeting, showPoweredBy, poweredByText, poweredByUrl, consentText, requireConsent, defaultCountry, dailyCap, notifyEmail, notifySmsNumber. Re-normalized on save, and this REPLACES the whole settings blob — read widgets.get first and send the full object back.