← All action domains

Widgets

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

FieldTypeRequiredDescription
widget_idstring (uuid)requiredThe 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_idstring (uuid)optionalThe team member to ring. Required when kind is 'seat'.
external_e164stringoptionalThe phone number to ring. Required when kind is 'number'.
phone_number_idstring (uuid)optionalWhich of the org's numbers to place the call from.

Example

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

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

FieldTypeRequiredDescription
widget_idstring (uuid)requiredThe widget to allow the site for.
originstringrequiredThe site, e.g. "https://www.acme.com". A bare host is assumed to be https.

Example

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

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.

Parameters

FieldTypeRequiredDescription
namestringrequiredWhat the widget is called internally.

Example

curl -X POST https://app.chirply.io/api/v1/actions/widgets.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 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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe widget to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/widgets.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 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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe click-to-call widget to install.

Example

curl -X POST https://app.chirply.io/api/v1/actions/widgets.embed_snippet \
  -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 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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe click-to-call widget's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/widgets.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 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.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
status"draft" | "published" | "archived"optionalOnly widgets in this status.
querystringoptionalText to match in the widget name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/widgets.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 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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe widget to put live.

Example

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

Remove a widget agent

widgets.remove_agentwriteadmin only

Stop a widget ringing a particular team member or number. Removing the last agent leaves the widget with nobody to connect visitors to.

Parameters

FieldTypeRequiredDescription
agent_idstring (uuid)requiredThe widget agent to remove.

Example

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

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.

Parameters

FieldTypeRequiredDescription
origin_idstring (uuid)requiredThe allowed-site entry to remove.

Example

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

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

FieldTypeRequiredDescription
widget_idstring (uuid)requiredThe widget whose hours to set.
timezonestringrequiredIANA timezone, e.g. "America/New_York". Invalid values fall back to UTC.
hoursobjectrequiredBusiness hours for all seven days.
hours.monobjectrequiredOne 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.enabledbooleanrequiredWhether the widget takes calls that day.
hours.mon.startstringrequiredOpening time in the widget timezone, "HH:MM" 24-hour.
hours.mon.endstringrequiredClosing time in the widget timezone, "HH:MM" 24-hour.
hours.tueobjectrequiredOne 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.enabledbooleanrequiredWhether the widget takes calls that day.
hours.tue.startstringrequiredOpening time in the widget timezone, "HH:MM" 24-hour.
hours.tue.endstringrequiredClosing time in the widget timezone, "HH:MM" 24-hour.
hours.wedobjectrequiredOne 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.enabledbooleanrequiredWhether the widget takes calls that day.
hours.wed.startstringrequiredOpening time in the widget timezone, "HH:MM" 24-hour.
hours.wed.endstringrequiredClosing time in the widget timezone, "HH:MM" 24-hour.
hours.thuobjectrequiredOne 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.enabledbooleanrequiredWhether the widget takes calls that day.
hours.thu.startstringrequiredOpening time in the widget timezone, "HH:MM" 24-hour.
hours.thu.endstringrequiredClosing time in the widget timezone, "HH:MM" 24-hour.
hours.friobjectrequiredOne 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.enabledbooleanrequiredWhether the widget takes calls that day.
hours.fri.startstringrequiredOpening time in the widget timezone, "HH:MM" 24-hour.
hours.fri.endstringrequiredClosing time in the widget timezone, "HH:MM" 24-hour.
hours.satobjectrequiredOne 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.enabledbooleanrequiredWhether the widget takes calls that day.
hours.sat.startstringrequiredOpening time in the widget timezone, "HH:MM" 24-hour.
hours.sat.endstringrequiredClosing time in the widget timezone, "HH:MM" 24-hour.
hours.sunobjectrequiredOne 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.enabledbooleanrequiredWhether the widget takes calls that day.
hours.sun.startstringrequiredOpening time in the widget timezone, "HH:MM" 24-hour.
hours.sun.endstringrequiredClosing time in the widget timezone, "HH:MM" 24-hour.

Example

curl -X POST https://app.chirply.io/api/v1/actions/widgets.save_schedule \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "widget_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "timezone": "example",
    "hours": {
      "mon": {
        "enabled": true,
        "start": "example",
        "end": "example"
      },
      "tue": {
        "enabled": true,
        "start": "example",
        "end": "example"
      },
      "wed": {
        "enabled": true,
        "start": "example",
        "end": "example"
      },
      "thu": {
        "enabled": true,
        "start": "example",
        "end": "example"
      },
      "fri": {
        "enabled": true,
        "start": "example",
        "end": "example"
      },
      "sat": {
        "enabled": true,
        "start": "example",
        "end": "example"
      },
      "sun": {
        "enabled": true,
        "start": "example",
        "end": "example"
      }
    }
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe widget to take offline.

Example

curl -X POST https://app.chirply.io/api/v1/actions/widgets.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 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

FieldTypeRequiredDescription
idstring (uuid)requiredThe widget to edit.
namestringoptionalNew widget name (trimmed to 120 characters).
mode"call" | "sms" | "both"optionalWhat visitors can request: a call, a text, or both.
dial_strategy"simulring" | "sequential"optionalsimulring rings every agent at once; sequential rings them in order.
ring_timeout_secondsintegeroptionalHow long to ring before giving up. Clamped to 5–120 seconds.
view_type"both" | "desktop" | "mobile" | "none"optionalWhich devices the launcher appears on.
settingsmap of string → objectoptionalAppearance 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.

Example

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