Skip to content
chatwoot logo

Chatwoot

chatwoot

Chatwoot customer support API via curl. Use this skill to manage contacts, conversations, and messages for multi-channel customer support.

SKILL.md

Full skill instructions

Chatwoot

Use Chatwoot via direct curl calls to manage customer support across multiple channels (website, email, WhatsApp, etc.).

Official docs: https://developers.chatwoot.com/​api-reference/​introduction


When to Use

Use this skill when you need to:

  • Manage contacts - create, search, and update customer profiles
  • Handle conversations - create, assign, and track support conversations
  • Send messages - reply to customers or add internal notes
  • List agents - get support team information
  • Automate workflows - integrate with CRM, ticketing, or notification systems

Prerequisites

  1. Set up Chatwoot (Cloud or Self-hosted)
  2. Log in and go to Profile Settings to get your API access token
  3. Note your Account ID from the URL (e.g., /​app/​accounts/​1/​...)
export CHATWOOT_API_TOKEN="your-api-access-token"
export CHATWOOT_ACCOUNT_ID="1"
export CHATWOOT_BASE_URL="https://app.chatwoot.com" # or your self-hosted URL

API Types

API TypeAuthUse Case
Application APIUser access_tokenAgent/​admin automation
Client APIinbox_identifierCustom chat interfaces
Platform APIPlatform App tokenMulti-tenant management (self-hosted only)

Important: When using $VAR in a command that pipes to another command, wrap the command containing $VAR in bash -c '...'. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.

bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY"' | jq .

How to Use

All examples use the Application API with user access token.


1. Create a Contact

Create a new contact in your account:

Write to /​tmp/​chatwoot_request.json:

{
  "inbox_id": 1,
  "name": "John Doe",
  "email": "[email protected]",
  "phone_number": "+1234567890",
  "identifier": "customer_123",
  "additional_attributes": {
    "company": "Acme Inc",
    "plan": "premium"
  }
}

Then run:

bash -c 'curl -s -X POST "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​contacts" -H "api_access_token: ${CHATWOOT_API_TOKEN}" -H "Content-Type: application/​json" -d @/​tmp/​chatwoot_request.json'

2. Search Contacts

Search contacts by email, phone, or name:

bash -c 'curl -s -X GET "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​contacts/​[email protected]" -H "api_access_token: ${CHATWOOT_API_TOKEN}"' | jq '.payload[] | {id, name, email}'

3. Get Contact Details

Get a specific contact by ID. Replace <contact-id> with the actual contact ID from the "Search Contacts" or "Create a Contact" response:

bash -c 'curl -s -X GET "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​contacts/<contact-id>" -H "api_access_token: ${CHATWOOT_API_TOKEN}"'

4. Create a Conversation

Create a new conversation with a contact:

Write to /​tmp/​chatwoot_request.json:

{
  "source_id": "api_conversation_123",
  "inbox_id": 1,
  "contact_id": 123,
  "status": "open",
  "message": {
    "content": "Hello! How can I help you today?"
  }
}

Then run:

bash -c 'curl -s -X POST "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​conversations" -H "api_access_token: ${CHATWOOT_API_TOKEN}" -H "Content-Type: application/​json" -d @/​tmp/​chatwoot_request.json'

5. List Conversations

Get all conversations with optional filters:

# List open conversations
bash -c 'curl -s -X GET "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​conversations?status=open" -H "api_access_token: ${CHATWOOT_API_TOKEN}"' | jq '.data.payload[] | {id, status, contact: .meta.sender.name}'

6. Get Conversation Details

Get details of a specific conversation. Replace <conversation-id> with the actual conversation ID from the "List Conversations" or "Create a Conversation" response:

bash -c 'curl -s -X GET "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​conversations/<conversation-id>" -H "api_access_token: ${CHATWOOT_API_TOKEN}"'

7. Send a Message

Send a message in a conversation. Replace <conversation-id> with the actual conversation ID from the "List Conversations" response:

Write to /​tmp/​chatwoot_request.json:

{
  "content": "Thank you for contacting us! Let me help you with that.",
  "message_type": "outgoing",
  "private": false
}

Then run:

bash -c 'curl -s -X POST "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​conversations/<conversation-id>/​messages" -H "api_access_token: ${CHATWOOT_API_TOKEN}" -H "Content-Type: application/​json" -d @/​tmp/​chatwoot_request.json'

8. Add Private Note

Add an internal note (not visible to customer). Replace <conversation-id> with the actual conversation ID from the "List Conversations" response:

Write to /​tmp/​chatwoot_request.json:

{
  "content": "Customer is a VIP - handle with priority",
  "message_type": "outgoing",
  "private": true
}

Then run:

bash -c 'curl -s -X POST "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​conversations/<conversation-id>/​messages" -H "api_access_token: ${CHATWOOT_API_TOKEN}" -H "Content-Type: application/​json" -d @/​tmp/​chatwoot_request.json'

9. Assign Conversation

Assign a conversation to an agent. Replace <conversation-id> with the actual conversation ID and <agent-id> with the agent ID from the "List Agents" response:

Write to /​tmp/​chatwoot_request.json:

{
  "assignee_id": 1
}

Then run:

bash -c 'curl -s -X POST "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​conversations/<conversation-id>/​assignments" -H "api_access_token: ${CHATWOOT_API_TOKEN}" -H "Content-Type: application/​json" -d @/​tmp/​chatwoot_request.json'

10. Update Conversation Status

Change conversation status (open, resolved, pending). Replace <conversation-id> with the actual conversation ID from the "List Conversations" response:

Write to /​tmp/​chatwoot_request.json:

{
  "status": "resolved"
}

Then run:

bash -c 'curl -s -X POST "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​conversations/<conversation-id>/​toggle_status" -H "api_access_token: ${CHATWOOT_API_TOKEN}" -H "Content-Type: application/​json" -d @/​tmp/​chatwoot_request.json'

11. List Agents

Get all agents in the account:

bash -c 'curl -s -X GET "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​agents" -H "api_access_token: ${CHATWOOT_API_TOKEN}"' | jq '.[] | {id, name, email, role, availability_status}'

12. List Inboxes

Get all inboxes (channels) in the account:

bash -c 'curl -s -X GET "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​inboxes" -H "api_access_token: ${CHATWOOT_API_TOKEN}"' | jq '.payload[] | {id, name, channel_type}'

13. Get Conversation Counts

Get counts by status for dashboard:

bash -c 'curl -s -X GET "${CHATWOOT_BASE_URL}/​api/​v1/​accounts/​${CHATWOOT_ACCOUNT_ID}/​conversations/​meta" -H "api_access_token: ${CHATWOOT_API_TOKEN}"' | jq '.meta.all_count, .meta.mine_count'

Conversation Status

StatusDescription
openActive conversation
resolvedClosed/​completed
pendingWaiting for response
snoozedTemporarily paused

Message Types

TypeValueDescription
OutgoingoutgoingAgent to customer
IncomingincomingCustomer to agent
Privateprivate: trueInternal note (not visible to customer)

Response Fields

Contact

FieldDescription
idContact ID
nameContact name
emailEmail address
phone_numberPhone number
identifierExternal system ID
custom_attributesCustom fields

Conversation

FieldDescription
idConversation ID
inbox_idChannel/​inbox ID
statusCurrent status
assigneeAssigned agent
contactCustomer info

Message

FieldDescription
idMessage ID
contentMessage text
message_typeincoming/​outgoing
privateIs internal note
statussent/​delivered/​read/​failed

Guidelines

  1. Get API token from Profile Settings: Log into Chatwoot → Profile → Access Token
  2. Account ID is in URL: Look at /​app/​accounts/​{id}/​... in your browser
  3. Inbox ID is required: Get inbox IDs first with the list inboxes endpoint
  4. Use source_id for conversations: Required to create conversations via API
  5. Private messages: Set private: true for internal notes
  6. Self-hosted: Change CHATWOOT_BASE_URL to your instance URL
  7. Webhooks recommended: Use webhooks for real-time updates instead of polling

More skills from majiayu000

xiaohongshu logo
majiayu000/claude-arsenal

xiaohongshu

xiaohongshu

286 148
View
agent-task-conductor logo
majiayu000/claude-skill-registry

agent-task-conductor

Conduct multi-agent task orchestration and workflow coordination.

663 1
View
conductor-setup logo
majiayu000/claude-skill-registry

conductor-setup

Initialize project with Conductor artifacts (product definition,

663 1
View
animation-designer logo
majiayu000/claude-skill-registry

animation-designer

Expert in web animations, transitions, and motion design using Framer Motion and CSS

663 1
View
diagramming logo
majiayu000/claude-skill-registry

diagramming

Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...

663 1
View
h3-pg logo
majiayu000/claude-skill-registry-data

h3-pg

PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.

23 1
View
conductor-development logo
majiayu000/claude-skill-registry

conductor-development

Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...

663 1
View
conductor-status logo
majiayu000/claude-skill-registry

conductor-status

Display project status, active tracks, and next actions

663 1
View
dockerization logo
majiayu000/claude-skill-registry

dockerization

Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.

663 1
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View