← All action domains

Live chat

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.

Close

live_chat.closewriteconfirm

Close a website live-chat conversation and prevent more visitor, AI, or teammate messages. Its transcript is retained, but the current UI cannot reopen 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)requiredLive-chat session to close.

Example

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

Save changes

live_chat.configure_widgetwriteadmin only

Update a live-chat widget's complete branding, visitor intake, AI handoff, white-label link, and device placement. Existing live conversations keep their transcript; published embeds use the changes immediately.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredLive-chat widget to configure.
namestringoptionalInternal widget name shown to the team.
ai_agent_idstring (uuid) (or null)optionalActive AI agent to connect, or null for human-only chat.
view_type"both" | "desktop" | "mobile" | "none"optionalDevices on which the launcher appears; none hides it everywhere.
settingsobjectoptionalBrand, intake, AI, copy, and white-label settings for the widget.
settings.primaryColorstringoptionalPrimary brand color as a hex value, used on the launcher, header, and visitor bubbles.
settings.launcherLabelstringoptionalShort text shown beside the chat icon on the website launcher.
settings.buttonPosition"bottom-right" | "bottom-left" | "top-right" | "top-left"optionalThe website corner where the launcher and panel appear.
settings.headingstringoptionalTitle in the chat panel header.
settings.welcomeMessagestringoptionalFirst message every visitor sees before starting a chat.
settings.offlineMessagestringoptionalMessage shown when AI cannot answer and the team must follow up.
settings.handoffMessagestringoptionalMessage shown when AI passes the visitor to a human teammate.
settings.logoUrlstring (or null)optionalPublic HTTPS URL for the logo shown in the chat header, or null to remove it.
settings.avatarUrlstring (or null)optionalPublic HTTPS URL for the avatar beside AI and team replies, or null to use the default icon.
settings.collectName"off" | "optional" | "required" | booleanoptionalWhether the chat asks for a visitor name: off, optional, or required. Legacy true means required and false means off.
settings.collectEmail"off" | "optional" | "required" | booleanoptionalWhether the chat asks for email: off, optional, or required. Collected emails create or match CRM contacts; legacy booleans remain accepted.
settings.collectPhone"off" | "optional" | "required" | booleanoptionalWhether the chat asks for a phone number: off, optional, or required. Collected numbers are normalized and create or match CRM contacts.
settings.smsContinuationbooleanoptionalKeep the conversation going by text: when a visitor who shared a phone number is no longer on the page (their chat widget stopped polling), team replies to that chat are delivered as a real SMS from the account's own number — billed to the org's own Twilio account — instead of waiting in the closed tab. Exactly one channel per reply: visitors still in the chat only see it in the widget, and numbers that opted out of SMS are never texted. Defaults to on whenever phone collection is on.
settings.aiEnabledbooleanoptionalWhether the connected AI agent answers first; humans can still take over.
settings.showPoweredBybooleanoptionalWhether a powered-by link appears at the bottom of the chat.
settings.poweredByTextstringoptionalLabel for the powered-by link, such as Powered by Acme.
settings.poweredByUrlstring (or null)optionalDestination URL for the powered-by link, or null for unlinked text.
settings.copyobjectoptionalEditable visitor-facing copy. Override any fields to translate or rewrite the widget while omitted fields retain English defaults.
settings.copy.aiStatusstringoptionalStatus shown while the AI agent owns the chat.
settings.copy.humanStatusstringoptionalStatus shown while a teammate owns the chat.
settings.copy.waitingStatusstringoptionalStatus shown while the visitor waits for the team.
settings.copy.closedStatusstringoptionalStatus shown after the conversation is closed.
settings.copy.closeLabelstringoptionalAccessible label for the close-chat button.
settings.copy.startHeadingstringoptionalHeading above the visitor details form.
settings.copy.namePlaceholderstringoptionalPlaceholder in the visitor name field.
settings.copy.emailPlaceholderstringoptionalPlaceholder in the visitor email field.
settings.copy.phonePlaceholderstringoptionalPlaceholder in the visitor phone field.
settings.copy.optionalSuffixstringoptionalText appended to optional-field placeholders, including any desired leading space.
settings.copy.startButtonstringoptionalButton text that starts a conversation.
settings.copy.startingButtonstringoptionalButton text while a conversation is starting.
settings.copy.thinkingStatusstringoptionalInline status while AI prepares a reply.
settings.copy.sendingStatusstringoptionalInline status while a message is sending.
settings.copy.messagePlaceholderstringoptionalPlaceholder in the open-chat message composer.
settings.copy.closedPlaceholderstringoptionalPlaceholder in the composer after a chat closes.
settings.copy.newChatLabelstringoptionalButton shown after a chat is closed so the visitor can start a new one.
settings.copy.sendLabelstringoptionalAccessible label for the send-message button.
settings.copy.startErrorstringoptionalFallback error shown when a chat session cannot start.
settings.copy.sendErrorstringoptionalFallback error shown when a visitor message cannot be sent.
settings.copy.textNoticestringoptionalNotice shown in the thread when SMS continuation applies; {phone} is replaced with the visitor's number.

Example

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

Create live chat

live_chat.create_widgetwriteadmin only

Create a draft branded live-chat widget. It does not appear on a website until it is configured, given an allowed site, installed, and published.

Parameters

FieldTypeRequiredDescription
namestringrequiredInternal widget name shown to the team.
ai_agent_idstring (uuid) (or null)optionalActive AI agent to connect, or null for human-only chat.
settingsobjectoptionalBrand, intake, AI, copy, and white-label settings for the widget.
settings.primaryColorstringoptionalPrimary brand color as a hex value, used on the launcher, header, and visitor bubbles.
settings.launcherLabelstringoptionalShort text shown beside the chat icon on the website launcher.
settings.buttonPosition"bottom-right" | "bottom-left" | "top-right" | "top-left"optionalThe website corner where the launcher and panel appear.
settings.headingstringoptionalTitle in the chat panel header.
settings.welcomeMessagestringoptionalFirst message every visitor sees before starting a chat.
settings.offlineMessagestringoptionalMessage shown when AI cannot answer and the team must follow up.
settings.handoffMessagestringoptionalMessage shown when AI passes the visitor to a human teammate.
settings.logoUrlstring (or null)optionalPublic HTTPS URL for the logo shown in the chat header, or null to remove it.
settings.avatarUrlstring (or null)optionalPublic HTTPS URL for the avatar beside AI and team replies, or null to use the default icon.
settings.collectName"off" | "optional" | "required" | booleanoptionalWhether the chat asks for a visitor name: off, optional, or required. Legacy true means required and false means off.
settings.collectEmail"off" | "optional" | "required" | booleanoptionalWhether the chat asks for email: off, optional, or required. Collected emails create or match CRM contacts; legacy booleans remain accepted.
settings.collectPhone"off" | "optional" | "required" | booleanoptionalWhether the chat asks for a phone number: off, optional, or required. Collected numbers are normalized and create or match CRM contacts.
settings.smsContinuationbooleanoptionalKeep the conversation going by text: when a visitor who shared a phone number is no longer on the page (their chat widget stopped polling), team replies to that chat are delivered as a real SMS from the account's own number — billed to the org's own Twilio account — instead of waiting in the closed tab. Exactly one channel per reply: visitors still in the chat only see it in the widget, and numbers that opted out of SMS are never texted. Defaults to on whenever phone collection is on.
settings.aiEnabledbooleanoptionalWhether the connected AI agent answers first; humans can still take over.
settings.showPoweredBybooleanoptionalWhether a powered-by link appears at the bottom of the chat.
settings.poweredByTextstringoptionalLabel for the powered-by link, such as Powered by Acme.
settings.poweredByUrlstring (or null)optionalDestination URL for the powered-by link, or null for unlinked text.
settings.copyobjectoptionalEditable visitor-facing copy. Override any fields to translate or rewrite the widget while omitted fields retain English defaults.
settings.copy.aiStatusstringoptionalStatus shown while the AI agent owns the chat.
settings.copy.humanStatusstringoptionalStatus shown while a teammate owns the chat.
settings.copy.waitingStatusstringoptionalStatus shown while the visitor waits for the team.
settings.copy.closedStatusstringoptionalStatus shown after the conversation is closed.
settings.copy.closeLabelstringoptionalAccessible label for the close-chat button.
settings.copy.startHeadingstringoptionalHeading above the visitor details form.
settings.copy.namePlaceholderstringoptionalPlaceholder in the visitor name field.
settings.copy.emailPlaceholderstringoptionalPlaceholder in the visitor email field.
settings.copy.phonePlaceholderstringoptionalPlaceholder in the visitor phone field.
settings.copy.optionalSuffixstringoptionalText appended to optional-field placeholders, including any desired leading space.
settings.copy.startButtonstringoptionalButton text that starts a conversation.
settings.copy.startingButtonstringoptionalButton text while a conversation is starting.
settings.copy.thinkingStatusstringoptionalInline status while AI prepares a reply.
settings.copy.sendingStatusstringoptionalInline status while a message is sending.
settings.copy.messagePlaceholderstringoptionalPlaceholder in the open-chat message composer.
settings.copy.closedPlaceholderstringoptionalPlaceholder in the composer after a chat closes.
settings.copy.newChatLabelstringoptionalButton shown after a chat is closed so the visitor can start a new one.
settings.copy.sendLabelstringoptionalAccessible label for the send-message button.
settings.copy.startErrorstringoptionalFallback error shown when a chat session cannot start.
settings.copy.sendErrorstringoptionalFallback error shown when a visitor message cannot be sent.
settings.copy.textNoticestringoptionalNotice shown in the thread when SMS continuation applies; {phone} is replaced with the visitor's number.

Example

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

Delete widget

live_chat.delete_widgetwriteconfirmadmin only

Permanently delete a live-chat widget, all visitor sessions, and every message transcript it collected. The installed launcher stops working and 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)requiredLive-chat widget to permanently delete.

Example

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

Install live chat

live_chat.embed_snippetread

Get the one-line script tag that installs a live-chat widget on a website — paste it into the site's HTML just before </body> — plus the widget's standalone chat page URL. This is the LIVE-CHAT loader (/embed/chat.js and /c/<key>); the click-to-call loader returned by widgets.embed_snippet is a different script and will not open a chat panel, so do not substitute one for the other. The launcher only renders once the widget is published and the site has been added as an allowed origin, so the returned status and origin list are the two things to check when it does not appear. Read-only.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredLive-chat widget to install.

Example

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

Read live chat

live_chat.getread

Read one website chat and its complete ordered transcript, including visitor, AI, teammate, and system messages. Reads only and does not change ownership.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredLive-chat session to read.

Example

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

Open live chat

live_chat.get_widgetread

Fetch one branded website live-chat widget with everything its builder shows: its publication status, the AI agent connected to it, which devices the launcher appears on, its full normalized live-chat settings (brand colors, launcher label and position, panel heading, welcome/offline/handoff messages, visitor name/email/phone intake, white-label powered-by link, and every piece of editable visitor-facing copy), the websites it is allowed to appear on, and its install snippet. Live chat only — a click-to-call widget's id returns not-found here, because its settings are a completely different shape; read those with widgets.get. Read-only: it changes nothing, sends nothing, and returns no visitor transcripts (use live_chat.get for those).

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredLive-chat widget to read.

Example

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

Hand to AI

live_chat.hand_to_aiwrite

Return a human-controlled website chat to its connected AI agent. The AI will answer the visitor's next message using that agent's persona and Brain.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredLive-chat session to return to AI.

Example

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

List live chats

live_chat.listread

List website live-chat sessions, newest activity first, including visitor identity, current AI/human ownership, assignee, source page, and connected widget. Reads only.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
state"ai" | "human" | "waiting" | "closed"optionalOnly conversations in this ownership state.
widget_idstring (uuid)optionalOnly conversations from this live-chat widget.

Example

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

List live-chat widgets

live_chat.list_widgetsread

List this account's branded website live-chat widgets and their publication, AI, placement, and appearance settings. Reads only and sends nothing.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
status"draft" | "published" | "archived"optionalOnly widgets with this publication status.

Example

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

Send reply

live_chat.replywriteconfirm

SENDS A REAL LIVE-CHAT MESSAGE to the website visitor immediately. The reply appears in their open widget, moves ownership to the human team, assigns the acting user when there is one, and pauses AI. When the widget's "keep the conversation going by text" setting is on and the visitor shared a phone number but has since left the page, the reply is ALSO delivered to them as a real SMS from the account's own number — billed to the org's own Twilio account (the result reports texted_to when that happened; visitors still on the page, or numbers opted out of SMS, are never texted). There is no draft or undo.

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)requiredLive-chat session to reply to.
bodystringrequiredMessage text the website visitor will receive immediately.

Example

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

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

Publish widget

live_chat.set_widget_statuswriteconfirmadmin only

Publish or unpublish a live-chat widget. Publishing makes the installed launcher visible on every allowed website; unpublishing removes it on the loader's next refresh without deleting conversations.

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)requiredLive-chat widget to publish or unpublish.
publishedbooleanrequiredtrue publishes the widget; false returns it to draft.

Example

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

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

Take over

live_chat.take_overwrite

Move a waiting or AI-handled website chat to human control and assign it to the acting user when there is one. AI stops answering until someone explicitly hands the chat back.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredLive-chat session to take over.

Example

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