← All action domains

Team chat

41 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 AI to a chat channel

team_chat.add_aiwriteconfirm

Put an AI employee or AI agent into a team-chat room so people can @mention it there. It will be able to read everything said in that room from then on — including, in a PRIVATE channel, the whole history. An AI employee added this way acts under the permissions of whichever person asks it something, never its own. Only the channel's owner, its creator, or a account owner/admin can.

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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
bot_kind"employee" | "agent"requiredemployee = an AI coworker from AI Employees, which can take actions under the asking person's permissions. agent = a customer-facing receptionist from AI Agents, which answers in its own persona but takes no actions.
bot_idstring (uuid)requiredThe AI employee's or AI agent's id, from team_chat.list_ai.

Example

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

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

Add people to a chat channel

team_chat.add_memberswriteconfirm

Add teammates to a channel and notify the people added. A private channel grants access to its entire past transcript. You must already belong to the channel. Linked project chats require an account admin; other channels allow existing members to add people.

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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
user_idsarray of (string (uuid))requiredThe teammates to add.

Example

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

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

Archive a chat channel

team_chat.archive_channelwriteconfirm

Archive a channel so it drops out of everyone's sidebar and takes no new messages. The transcript is kept and the channel can be unarchived with `archived: false`. Only the channel's owner, its creator, or a account owner/admin can.

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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
archivedbooleanoptionalTrue to archive, false to bring the channel back. Default: true

Example

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

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

Ask an AI in a chat channel

team_chat.ask_aiwriteconfirm

Post a question into a team-chat room addressed to an AI that is already in it, wait for that AI to answer, and return its reply. Everyone in the room sees both the question and the answer. This SPENDS MODEL CREDITS on the account's own AI key, and an AI employee may take real actions while answering — under the permissions of the person asking, with anything risky stopping in the approvals inbox. Slow by nature: a turn with tool calls can take tens of seconds. Acts as the signed-in person, so an API key cannot use 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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
bot_kind"employee" | "agent"requiredemployee = an AI coworker from AI Employees, which can take actions under the asking person's permissions. agent = a customer-facing receptionist from AI Agents, which answers in its own persona but takes no actions.
bot_idstring (uuid)requiredThe AI employee's or AI agent's id, from team_chat.list_ai.
bodystringrequiredThe message text. Mention a teammate by typing @ and their name or email — it is resolved to that person and pings them. '@all' pings everyone in the room.
parent_idstring (uuid)optionalAsk inside this message's thread instead of the channel.

Example

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

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

How much history a channel holds

team_chat.channel_statsread

How far back one channel or direct message goes and how much is in it: when its oldest surviving message was posted, when the most recent one was, how many messages it holds in total, and how many of those are in the main transcript rather than inside threads. Read this BEFORE paging a room you have not read — it is what turns 'give me everything from 2019' from blind paging into a bounded range read with team_chat.list_messages. Deleted messages and the grey system lines ('Sam joined the channel') are excluded from both counts, since neither is what a person means by a message. Refuses a room the caller cannot see.

Parameters

FieldTypeRequiredDescription
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.

Example

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

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

Create a chat channel

team_chat.create_channelwrite

Open a new internal chat channel and add teammates to it. A private channel is invisible to everyone outside its member list and cannot be opened up later, so choose deliberately. Channel names are unique within the account.

Parameters

FieldTypeRequiredDescription
namestringrequiredThe channel's name, as it appears in the sidebar. A leading '#' is stripped.
topicstringoptionalOne line saying what the channel is for. Shown in its details panel.
is_privatebooleanoptionalPrivate channels are invisible to everyone who is not a member, and cannot be made public again afterwards. Default: false
member_idsarray of (string (uuid))optionalTeammates to add straight away, besides the creator.

Example

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

Delete a chat conversation

team_chat.delete_channelwriteconfirmadmin only

PERMANENTLY delete an internal chat conversation — a channel or a direct message — and everything inside it: every message for every member, every reaction, every starred item, and every file that was shared in it, which is deleted from storage too. There is no undo and no export; archiving (team_chat.archive_channel) is the reversible version and is almost always what is wanted instead. Only an account owner or admin can, and only in a room they can already see, so a private room or a DM they are not in stays out of reach. Any AI employee duty that was reporting into this room keeps running but announces nowhere afterwards.

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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.

Example

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

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

Delete a chat message

team_chat.delete_messagewriteconfirm

Remove a message from the conversation. Its text and any attachments stop being readable immediately and cannot be recovered. You can delete your own messages; account owners and admins can delete anyone's.

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
message_idstring (uuid)requiredId of the message, from team_chat.list_messages; imported records use stable GUIDs.

Example

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

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

Edit a chat message

team_chat.edit_messagewrite

Rewrite the text of a message you sent. It is marked as edited for everyone in the room. You can only edit your own messages — not a colleague's, whatever your role.

Parameters

FieldTypeRequiredDescription
message_idstring (uuid)requiredId of the message, from team_chat.list_messages; imported records use stable GUIDs.
bodystringrequiredThe message text. Mention a teammate by typing @ and their name or email — it is resolved to that person and pings them. '@all' pings everyone in the room.

Example

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

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

View channel image

team_chat.get_channel_imageread

Read a channel's current picture as base64 bytes and its image MIME type, or null when no picture is set. Applies the same channel visibility rules as chat; an API key can read only open channels. Does not change data or send messages.

Parameters

FieldTypeRequiredDescription
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.

Example

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

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

Read chat images

team_chat.inspect_imageswriteconfirm

Read pictures and screenshots attached to selected chat messages, including visible text. Inspects up to four PNG, JPEG, WebP or GIF images per request (6 MB each) using the account's vision model; AI usage is billed to its connected OpenRouter account. Returns observations and explicit unreadable/skipped results. Reads only messages and stored attachments in a channel the caller can see; never fetches arbitrary URLs. Use list_messages to find message ids, including older messages and thread replies.

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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
message_idsarray of (string (uuid))requiredMessage ids from this channel, in priority order; the first four supported images are inspected.
questionstringoptionalWhat to look for, such as an error message, chart values or text to transcribe. Omit for a general description.

Example

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

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

Join a chat channel

team_chat.join_channelwrite

Join an open channel, so it appears in your sidebar and you start getting its messages. A short 'joined the channel' line is posted. Private channels cannot be joined — someone in them has to add you.

Parameters

FieldTypeRequiredDescription
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.

Example

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

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

Leave a chat conversation

team_chat.leave_channelwriteconfirm

Leave a channel or a group direct message. It drops out of your sidebar and stops notifying you; the transcript stays for everyone else and you can rejoin an open channel later. Leaving a PRIVATE channel means you can no longer see it at all unless someone adds you back. Leaving a direct message removes only your seat — starting a direct message with the same people again reopens the same thread with its history.

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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.

Example

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

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

List AI available for chat

team_chat.list_airead

List every AI in this account that can be put into a team-chat room — AI employees (which can take actions) and AI agents (which answer as themselves). Shows whether each is currently active; a paused employee or a switched-off agent stays silent in chat.

Parameters

No parameters — POST an empty body.

Example

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

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

List who is in a chat channel

team_chat.list_channel_membersread

List the PEOPLE in one channel or direct message by name, each with when they last posted in that room, how many messages they have posted in it, and when they joined it. This is the answer to 'who is in here' and 'who has gone quiet' — the transcript only shows who happened to speak recently, and team_chat.list_people returns the whole account rather than this room. Quietest first. Humans only: the AI members of a room are silent unless mentioned, so they are listed by team_chat.list_ai instead. Refuses a room the caller cannot see.

Parameters

FieldTypeRequiredDescription
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.

Example

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

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

List chat channels

team_chat.list_channelsread

List the internal chat rooms available to the caller: channels they have joined, open channels they could join, and their direct messages. Each row carries the room's last message, its member count, and the caller's own unread count. An API key sees open channels only — private rooms and DMs belong to a person.

Parameters

FieldTypeRequiredDescription
include_archivedbooleanoptionalInclude channels that have been archived. Default: false

Example

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

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

Read a chat conversation

team_chat.list_messagesread

Read messages from one channel or direct message, oldest first. The room's ENTIRE history is reachable through this action, however old: it is not capped to recent messages. Read the newest with no timestamps; read a date range by passing `after` and `before` together; walk a long room by repeating the call with `before` set to the oldest message you have so far, until `has_more` comes back false. Each page is at most 200 messages, so call team_chat.channel_stats first to find out how far back the room goes and how many messages are in it before paging a large one. Pass `parent_id` to read one thread's replies instead of the channel's main transcript — the two are separate, and the main transcript never contains thread replies. Refuses a room the caller cannot see.

Parameters

FieldTypeRequiredDescription
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
parent_idstring (uuid)optionalRead the replies under this message instead of the channel's main transcript.
beforestring (date-time)optionalReturn only messages sent strictly BEFORE this ISO 8601 timestamp. On its own it pages backwards through the room's history; together with `after` it is the end of a date range.
afterstring (date-time)optionalReturn only messages sent strictly AFTER this ISO 8601 timestamp — the start of a date range, or everything since a moment you have already read. Note that a page is filled from the NEWEST end of the range, so when `has_more` is true with both bounds set, the missing messages are the OLDER ones: move `before` back to the oldest message you received and call again.
limitintegeroptionalHow many messages to return. Default: 50

Example

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

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

List teammates for chat

team_chat.list_peopleread

List everyone in this account who can be messaged in team chat — their user id, display name, email, avatar and public GitHub usernames saved in their profile or linked in this account. These are staff, not CRM contacts; use contacts.list for customers. Sends no messages and costs nothing.

Parameters

No parameters — POST an empty body.

Example

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

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

Starred messages

team_chat.list_starredread

Read your own starred messages, newest star first, each with the room it was said in. Returns only the signed-in person's stars — there is no way to read anyone else's. Reads only and sends no notifications.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalHow many starred messages to return, newest star first. Default: 50

Example

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

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

Mark a conversation read

team_chat.mark_readwrite

Clear your unread badge for one channel or direct message, exactly as opening it in the app does. Personal to you. Acts as the signed-in person, so an API key cannot use it.

Parameters

FieldTypeRequiredDescription
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.

Example

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

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

Message a teammate directly

team_chat.message_personwriteconfirm

Send one direct message to a single teammate, starting the private conversation with them if there isn't one yet — the two steps a person takes by clicking a colleague's name in chat and typing. It appears immediately for them and pushes a notification to their desktop AND their phone, so treat it like tapping a real colleague on the shoulder. Costs nothing: this is internal staff chat, never an SMS or email to a customer. It can be edited or deleted afterwards, but not unsent. Acts as the signed-in person, so an API key — which has no colleagues — cannot use 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
user_idstring (uuid)requiredA teammate's user id, from team_chat.list_people. Not a contact id.
bodystringrequiredThe message text. Mention a teammate by typing @ and their name or email — it is resolved to that person and pings them. '@all' pings everyone in the room.

Example

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

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

Open a direct message with an AI

team_chat.open_ai_direct_messagewrite

Find or start your own private one-to-one conversation with an AI employee or agent, and return its channel id. Nobody else in the account can see it. In a one-to-one the AI answers every message without being @mentioned. Calling it twice never creates a second conversation. Acts as the signed-in person, so an API key cannot use it.

Parameters

FieldTypeRequiredDescription
bot_kind"employee" | "agent"requiredemployee = an AI coworker from AI Employees, which can take actions under the asking person's permissions. agent = a customer-facing receptionist from AI Agents, which answers in its own persona but takes no actions.
bot_idstring (uuid)requiredThe AI employee's or AI agent's id, from team_chat.list_ai.

Example

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

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

Open a direct message

team_chat.open_direct_messagewrite

Find or start the private conversation between you and one or more teammates, and return its channel id so you can post into it. Calling it twice never creates a second thread. Acts as the signed-in person, so an API key cannot use it.

Parameters

FieldTypeRequiredDescription
user_idsarray of (string (uuid))requiredThe teammates to talk to. You are added automatically.

Example

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

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

Attach a saved image

team_chat.prepare_image_attachmentwrite

Prepare a completed AI Studio or media-library image for a team-chat room you belong to. Copies the account-owned PNG/JPEG/GIF/WebP file (up to 6 MB) privately into that room without downloading image bytes into the model. Requires read access to the source library. Returns an attachment to pass unchanged to team_chat.send_message; this step sends no message and incurs no AI generation charge. Generate first with ai_studio.generate_image or assets.generate_image when a new image is needed.

Parameters

FieldTypeRequiredDescription
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
source"asset" | "generation"requiredasset for an assets media-library record; generation for a completed ai_studio image.
idstring (uuid)requiredThe saved asset or generation id returned by the image-generation or library tool. Never a URL.

Example

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

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

React to a chat message

team_chat.reactwrite

Add an emoji reaction to a message, or take yours off if it is already there — the same toggle as clicking the emoji in the app. Acts as the signed-in person, so an API key cannot use it.

Parameters

FieldTypeRequiredDescription
message_idstring (uuid)requiredId of the message, from team_chat.list_messages; imported records use stable GUIDs.
emojistringrequiredThe emoji itself, e.g. 👍 or ✅.

Example

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

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

Remove AI from a chat channel

team_chat.remove_aiwriteconfirm

Take an AI employee or agent out of a room. It stops answering there and stops seeing what is said. Anything it already did is not undone. Only the channel's owner, its creator, or a account owner/admin can.

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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
bot_kind"employee" | "agent"requiredemployee = an AI coworker from AI Employees, which can take actions under the asking person's permissions. agent = a customer-facing receptionist from AI Agents, which answers in its own persona but takes no actions.
bot_idstring (uuid)requiredThe AI employee's or AI agent's id, from team_chat.list_ai.

Example

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

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

Remove someone from a chat channel

team_chat.remove_memberwriteconfirm

Take a teammate out of a channel. In a private channel they immediately lose access to the whole conversation, including its history and files. Only the channel's owner, its creator, or a account owner/admin can.

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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
user_idstring (uuid)requiredA teammate's user id, from team_chat.list_people. Not a contact id.

Example

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

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

Search team chat

team_chat.searchread

Search the text of team-chat messages. Searches every room the caller can see unless `channel_id` narrows it to one conversation. Deliberately never reaches a private channel the caller is not a member of — naming one in `channel_id` returns nothing rather than searching it.

Parameters

FieldTypeRequiredDescription
querystringrequiredText to look for in message bodies.
channel_idstring (uuid)optionalSearch only this conversation. Omit to search every room the caller can see. A room the caller cannot see returns no matches rather than an error.
limitintegeroptionalHow many matches to return. Default: 30

Example

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

Send a chat message

team_chat.send_messagewriteconfirm

Post a message into a team-chat channel or direct message. It appears immediately for everyone in the room and pushes a notification to each member whose notification setting allows it — on their desktop AND on their phone, so real people are interrupted wherever they are; treat it like speaking in the room. Costs nothing: this is internal staff chat, never an SMS or email to a customer. A message can be edited or deleted afterwards, but not unsent. Messages posted by a signed-in person queue replies from mentioned AI teammates (and AI direct-message recipients); those replies use the account’s AI credits and run under that person’s permissions. Machine callers without a user cannot wake AI teammates. The sent message returns immediately; AI replies arrive separately.

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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
bodystringrequiredMessage text, including @mentions. May be empty when attaching a file.
attachmentsobject[]optionalUp to four files uploaded into this same room.
attachments[].keystringrequiredStorage key returned by team_chat.upload_attachment or team_chat.prepare_image_attachment.
attachments[].urlstringrequiredPrivate URL returned by the upload.
attachments[].namestringrequiredOriginal filename.
attachments[].contentTypestringrequiredValidated MIME type from the upload.
attachments[].sizeintegerrequiredFile size in bytes.
parent_idstring (uuid)optionalReply inside this message's thread instead of posting to the channel.

Example

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

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

Change channel image

team_chat.set_channel_imagewrite

Upload, replace or remove the picture shown for a channel in its chat list, header and Details. Accepts JPG, PNG or WebP up to 2 MB. Requires channel-management permission; linked project channels require an account admin. Images remain private to people who can view the channel. Does not send a chat message or change membership.

Parameters

FieldTypeRequiredDescription
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
image_base64string (or null)requiredRaw base64 image bytes, without a data URL prefix. Pass null to remove the channel picture.
content_type"image/png" | "image/jpeg" | "image/webp"optionalImage MIME type; required when uploading bytes, omitted when removing the picture.

Example

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

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

Set a channel's notifications

team_chat.set_notificationswrite

Choose what one channel sends you — every message, only mentions, or nothing — and whether it is starred to the top of your sidebar. Personal to you and invisible to everyone else in the room. Acts as the signed-in person, so an API key cannot use it.

Parameters

FieldTypeRequiredDescription
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
notify"all" | "mentions" | "none"optionalWhat this room sends to your devices: all messages, only ones that mention you, or nothing.
starredbooleanoptionalPin this room to the Starred section at the top of your sidebar.

Example

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

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

Share a message into another room

team_chat.share_messagewriteconfirm

Carry an existing team-chat message into another channel or direct message, with your own note above it. Unlike quoting, this brings the WHOLE message: who wrote it, when, its text, and its images and files, which are copied into the destination room so everyone there can open them. It posts as a new message in that room and notifies its members exactly like any other post — desktop and phone — so real people are interrupted; treat it like speaking in the room. Costs nothing: internal staff chat, never an SMS or email to a customer. You must be able to read the message AND be a member of the room it is going to. THIS IS HOW A PRIVATE ROOM'S CONTENT LEAVES IT: what you share becomes readable to everyone in the destination room, including people who were never in the room it came from, and it cannot be unsent — only deleted afterwards. Sharing a message that is itself a share carries the original rather than nesting one inside another. An expired ZIP archive is left behind and the card says how many files did not come along.

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
message_idstring (uuid)requiredId of the message, from team_chat.list_messages; imported records use stable GUIDs.
channel_idstring (uuid)requiredThe channel or direct message to carry it INTO — not the one it came from. You have to be a member of it.
notestringoptionalYour own words about it, posted above the shared message. @mentions here work normally; the shared message's own mentions are flattened to plain names and re-ping nobody.
parent_idstring (uuid)optionalShare it into this message's thread instead of the room's main transcript.

Example

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

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

Star a chat message

team_chat.star_messagewrite

Save a message to your own starred list, or take the star off if it is already there — the same toggle as clicking the star in the app. A star is PRIVATE: unlike a reaction, nobody else in the room can see that you saved it, and it changes nothing about the message for anyone else. Acts as the signed-in person, so an API key cannot use it. Sends no notifications.

Parameters

FieldTypeRequiredDescription
message_idstring (uuid)requiredId of the message, from team_chat.list_messages; imported records use stable GUIDs.

Example

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

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

Connect with an API token

team_chat.teamwork_connect_tokenwriteconfirm

Verifies and saves the signed-in person's own Teamwork API token (Teamwork → profile → Edit my details → API & Mobile), encrypted and readable by nobody else, including account administrators. It must be a token for the Teamwork site this account's administrator connected, and for the person's own Teamwork user — a sign-in this account already knows as another teammate is refused. Consumes one Teamwork read; imports nothing and changes nothing in Teamwork.

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
api_tokenstringrequiredThe person's own Teamwork API token (or an already-issued OAuth bearer token). Encrypted at rest and never returned.
auth_type"api_key" | "bearer"optionalapi_key for a personal API token from Teamwork's API & Mobile settings; bearer for an already-issued OAuth access token. Default: "api_key"

Example

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

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

Disconnect my Teamwork

team_chat.teamwork_disconnectwriteconfirm

Deletes the signed-in person's saved Teamwork token and stops importing and live-syncing their private conversations. Everything already imported stays in Team Chat. Only the person who connected can disconnect; it does not affect the account's own Teamwork connection or anyone else's.

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

No parameters — POST an empty body.

Example

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

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

Import my conversations

team_chat.teamwork_importwriteconfirm

Starts, resumes or re-scans the signed-in person's import of their private Teamwork conversations — one-to-ones and private groups they are a member of that were active in the last 3 months — and runs one bounded batch now; the rest continues in the background. Messages from the last 3 months come across under their original authors and dates without notifying anyone. Each conversation becomes a private Team Chat room seated with its matched participants only, and an untitled one-to-one becomes the direct message between the two people (merged into one that already exists). Conversations the account migration already imported are recognised and skipped. Reads Teamwork only; nothing is written back.

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

No parameters — POST an empty body.

Example

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

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

My Teamwork

team_chat.teamwork_statusread

Reads the signed-in person's own Teamwork connection: whether it is connected and as whom, which Teamwork site it must use, import progress (conversations and messages imported, errors) and the private conversations it brought into Team Chat. Never returns a token. Reads only; contacts nobody.

Parameters

No parameters — POST an empty body.

Example

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

Check for new messages

team_chat.teamwork_sync_nowwriteconfirm

Reads the newest messages in the signed-in person's imported private Teamwork conversations, using their own Teamwork connection, and posts anything said since into the matching Team Chat rooms under the original author's name with a Teamwork badge. New messages raise unread badges and send the usual Team Chat notifications to the people in that room. This also runs automatically every minute while the person stays connected. Reads Teamwork only; nothing is written back.

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

No parameters — POST an empty body.

Example

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

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

Update a chat channel

team_chat.update_channelwriteconfirm

Change a channel's name, its one-line description, its standing meeting link, or whether new teammates are added to it automatically. Only the channel's owner, its creator, or a account owner/admin can. Setting `is_private` to true is possible and permanent; the reverse is not, because it would retroactively expose a transcript people wrote in private — that one field is why this whole capability requires confirmation, even though the other fields (name, topic, meeting link, auto-join) are freely reversible.

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
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
namestringoptionalThe channel's name, as it appears in the sidebar. A leading '#' is stripped.
topicstring (or null)optionalOne line saying what the channel is for. Shown in its details panel.
meeting_urlstring (or null)optionalA standing video-call link for this channel (Zoom, Meet, Teams…).
is_privatetrueoptionalSet to true to close the channel. It cannot be reopened.
auto_joinbooleanoptionalPut every NEW member of this account into this channel as they join — the setting that keeps an all-hands room actually company-wide. Only valid on a PUBLIC channel; a private one refuses, because its membership is chosen. Applies to people who join later, not to the people already here, and never to external members (clients), who are only ever in rooms somebody put them in deliberately.

Example

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

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

Attach a file

team_chat.upload_attachmentwrite

Upload one file of up to 6 MB to a team-chat room you belong to — an image, video, audio clip, PDF or ZIP archive. Returns an attachment for team_chat.send_message. The 6 MB cap is this JSON surface's base64 transport limit; people using the app itself can attach files up to 25 MB, and team_chat.send_message accepts attachments of either origin. File bytes are validated like web chat uploads and remain private to the room, readable only by its members. ZIP archives are TEMPORARY: they delete themselves 14 days after upload and cannot be recovered, so do not use this as storage for anything that has to last. Uploading alone sends no notification; posting the attachment notifies room members according to their preferences.

Parameters

FieldTypeRequiredDescription
channel_idstring (uuid)requiredId of the channel or direct message, from team_chat.list_channels.
namestringrequiredOriginal filename including its extension. The extension decides the stored type and must be one of png, jpg, jpeg, gif, webp, svg, ico, mp4, m4v, mov, webm, mp3, wav, m4a, ogg, pdf or zip; a zip is deleted 14 days after upload.
content_typestringrequiredThe selected file's MIME type; actual bytes are checked independently.
base64stringrequiredBase64-encoded file bytes, without a data URL prefix. Maximum decoded size 6 MB.

Example

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

Over MCP the same operation is the tool team_chat_upload_attachment 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=team_chat — same operations, with full JSON Schemas. Authentication, errors and rate limits are covered in the API documentation home.