Skip to main content

Chatwoot SDK for Python

A modern, type-safe Python SDK for the Chatwoot API. This SDK provides both synchronous and asynchronous interfaces to interact with Chatwoot's REST API, with full type hints for better IDE support and code safety.

Features

  • 🔒 Type-safe: Full type hints with Pydantic models
  • ⚡ Async support: Both sync and async clients available
  • 🎯 Comprehensive: Covers all major Chatwoot API resources
  • 🛡️ Error handling: Custom exceptions for different error types

Installation

pip install chatwoot-sdk
# or
uv add chatwoot-sdk

Note: The PyPI package name is chatwoot-sdk. The GitHub repository is named chatwoot-sdk-python.

Quick Start

from chatwoot import ChatwootClient

# Initialize the client
client = ChatwootClient(
    base_url="https://app.chatwoot.com",
    api_token="your_api_token_here"
)

# Fetch your profile
profile = client.profile.get()
print(f"Logged in as: {profile.name}")

# List open conversations
conversations = client.conversations.list(
    account_id=1,
    status="open"
)

# Send a message
message = client.messages.create(
    account_id=1,
    conversation_id=42,
    content="Hello from Python SDK!"
)

# Always close the client when done
client.close()

Usage Examples

Using Context Manager

from chatwoot import ChatwootClient

with ChatwootClient(base_url="...", api_token="...") as client:
    profile = client.profile.get()
    conversations = client.conversations.list(account_id=1, status="open")
    # Client is automatically closed

Async Usage

import asyncio
from chatwoot import AsyncChatwootClient

async def main():
    async with AsyncChatwootClient(base_url="...", api_token="...") as client:
        profile = await client.profile.get()
        conversations = await client.conversations.list(
            account_id=1,
            status="open"
        )

asyncio.run(main())

Working with Conversations

# List conversations with filters
conversations = client.conversations.list(
    account_id=1,
    status="open",
    assignee_type="me",
    inbox_id=5,
    labels=["urgent", "billing"]
)

# Get conversation details
conversation = client.conversations.get(account_id=1, conversation_id=42)

# Update conversation
updated = client.conversations.update(
    account_id=1,
    conversation_id=42,
    status="resolved",
    assignee_id=10
)

# Add labels to conversation
labels = client.conversations.labels.add(
    account_id=1,
    conversation_id=42,
    labels=["bug", "priority"]
)

Managing Contacts

# Create a contact
contact = client.contacts.create(
    account_id=1,
    inbox_id=5,
    name="John Doe",
    email="john@example.com",
    phone_number="+1234567890"
)

# Search contacts
results = client.contacts.search(account_id=1, query="john@example.com")

# Update contact
contact = client.contacts.update(
    account_id=1,
    contact_id=100,
    name="Jane Doe",
    custom_attributes={"plan": "premium"}
)

# Add labels to contact
labels = client.contacts.labels.add(
    account_id=1,
    contact_id=100,
    labels=["vip", "premium"]
)

Sending Messages

# Send a text message
message = client.messages.create(
    account_id=1,
    conversation_id=42,
    content="Hello! How can I help you?",
    message_type="outgoing"
)

# Send a private note
note = client.messages.create(
    account_id=1,
    conversation_id=42,
    content="Internal note for team",
    message_type="outgoing",
    private=True
)

# Update a message
updated = client.messages.update(
    account_id=1,
    message_id=123,
    content="Updated message content"
)

Managing Teams

# List teams
teams = client.teams.list(account_id=1)

# Create a team
team = client.teams.create(
    account_id=1,
    name="Support Team",
    description="Customer support team"
)

# Add agents to team
client.teams.agents.add(
    account_id=1,
    team_id=5,
    agent_ids=[10, 11, 12]
)

# List team members
members = client.teams.agents.list(account_id=1, team_id=5)

Error Handling

from chatwoot import (
    ChatwootClient,
    ChatwootAuthError,
    ChatwootNotFoundError,
    ChatwootValidationError,
)

client = ChatwootClient(base_url="...", api_token="...")

try:
    conversation = client.conversations.get(account_id=1, conversation_id=999)
except ChatwootAuthError as e:
    print(f"Authentication failed: {e}")
except ChatwootNotFoundError as e:
    print(f"Resource not found: {e}")
except ChatwootValidationError as e:
    print(f"Validation error: {e}")
    if e.errors:
        for error in e.errors:
            print(f"  - {error['field']}: {error['message']}")

API Resources

The SDK provides access to the following Chatwoot API resources:

  • Profile: User profile information
  • Conversations: Conversation management and filtering
  • Messages: Send and manage messages
  • Contacts: Contact management and search
  • Inboxes: Inbox configuration
  • Teams: Team management
  • Agents: Agent management
  • Labels: Label management (nested under conversations and contacts)

Development

Setup

# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# Install dependencies
uv sync

# Run tests
uv run pytest

# Run tests with coverage
uv run pytest --cov=chatwoot --cov-report=term-missing

# Type check
uvx ty check .

# Lint
uv run ruff check .

# Format code
uv run ruff format .

Project Structure

chatwoot-sdk-python/
├── chatwoot/
│   ├── __init__.py           # Public API
│   ├── client.py             # Main client classes
│   ├── exceptions.py         # Custom exceptions
│   ├── _http.py              # HTTP client wrapper
│   ├── types/                # Pydantic models
│   │   ├── common.py
│   │   ├── conversation.py
│   │   ├── message.py
│   │   ├── contact.py
│   │   └── ...
│   └── resources/            # API resource implementations
│       ├── _base.py
│       ├── profile.py
│       ├── conversations.py
│       ├── messages.py
│       └── ...
├── tests/
│   └── unit/
├── examples/
└── README.md

Requirements

  • Python 3.11+
  • httpx
  • pydantic

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Support

Metadata

Release files for chatwoot-sdk 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for chatwoot-sdk 0.2.0
File Size Uploaded
chatwoot_sdk-0.2.0.tar.gz 68.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for chatwoot-sdk 0.2.0
File Interpreter ABI Platform
chatwoot_sdk-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 95.8 kB

Release files / chatwoot_sdk-0.2.0.tar.gz

Download URL chatwoot_sdk-0.2.0.tar.gz
Size 68.9 kB
Tags Source
SHA-256 checksum
How to use checksums
e3db1f66c359f7a10057b22aaf8a6bccfebd4243b810f4f5d3f793402f5f2e45
BLAKE2b-256 checksum
How to use checksums
de235d139a41318a69ea8f7e9085b5f65dcba645304b8cb5c2e772b0f1aac618
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 19, 2026.

Transparency log

Release files / chatwoot_sdk-0.2.0-py3-none-any.whl

Download URL chatwoot_sdk-0.2.0-py3-none-any.whl
Size 26.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
03e09a18192b8487b3a16655a72aa01c56a7682138d53769e4877d53001e2f5f
BLAKE2b-256 checksum
How to use checksums
4cf97c49b73678ae64df8569af172a2cfd932e7d80baaf628c74f0235d0db9b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 19, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page