Skip to main content
The Replies API gives you full access to your unified inbox — threads from both campaign replies and direct inbound emails. Use it to build custom CRM workflows, automate reply routing, or surface conversation context in your own product.

API Endpoints

MethodEndpointDescription
GET/repliesList all conversations (paginated, filterable)
GET/replies/threads/{thread_id}Get full thread details and messages
GET/replies/threads/{thread_id}/messagesGet messages in a thread
POST/replies/threads/{thread_id}/replySend a reply to a thread
PATCH/replies/threads/{thread_id}/readMark a thread as read/unread
PATCH/replies/threads/{thread_id}/starStar or unstar a thread
All reply endpoints require the replies:read, replies:create, or replies:update scope depending on the operation. Use replies:all to grant full access.

List Conversations

GET /api/public/v1/replies Returns a paginated list of reply threads across your workspace. Supports filtering by campaign, read status, category, and starred state.
import requests

response = requests.get(
    "https://api.coldsend.pro/api/public/v1/replies",
    headers={"X-API-Key": api_key},
    params={
        "page": 1,
        "limit": 20,
        "is_read": False,       # unread only
        "is_starred": False,
        "category": "interested"
    }
)

data = response.json()
print(f"Total threads: {data['total_count']}")
print(f"Unread: {data['unread_count']}")
for thread in data["conversations"]:
    print(f"  [{thread['lead_email']}] {thread['subject']}{thread['last_message_preview']}")

Query Parameters

ParameterTypeDescription
pageintPage number (default: 1)
limitintItems per page (1-100, default: 20)
campaign_idUUIDFilter threads by campaign
is_readboolFilter by read status
is_starredboolFilter starred threads
categorystringFilter by intent category (e.g. interested, not_interested)

Response Format

{
  "success": true,
  "conversations": [
    {
      "thread_id": "550e8400-e29b-41d4-a716-446655440000",
      "lead_id": "660e8400-e29b-41d4-a716-446655440001",
      "inbox_id": "770e8400-e29b-41d4-a716-446655440002",
      "lead_email": "jane@acme.com",
      "lead_name": "Jane Doe",
      "campaign_name": "Q1 Product Launch",
      "subject": "Re: Quick question about Acme",
      "last_message_preview": "Thanks for reaching out, I'd like to learn more...",
      "last_message_at": "2024-01-15T14:30:00Z",
      "is_read": false,
      "is_starred": false,
      "reply_count": 2,
      "category": "interested"
    }
  ],
  "total_count": 48,
  "page": 1,
  "limit": 20,
  "unread_count": 12,
  "starred_count": 3
}

Get Thread Details

GET /api/public/v1/replies/threads/{thread_id} Returns full metadata for a thread including lead info, campaign context, and message history.
response = requests.get(
    f"https://api.coldsend.pro/api/public/v1/replies/threads/{thread_id}",
    headers={"X-API-Key": api_key}
)

Get Thread Messages

GET /api/public/v1/replies/threads/{thread_id}/messages Returns the individual messages in a thread in chronological order.
response = requests.get(
    f"https://api.coldsend.pro/api/public/v1/replies/threads/{thread_id}/messages",
    headers={"X-API-Key": api_key}
)

Send a Reply

POST /api/public/v1/replies/threads/{thread_id}/reply Sends a reply within an existing thread. The system automatically routes it through the correct inbox, cancels pending sequences for that lead, and threads the message.
response = requests.post(
    f"https://api.coldsend.pro/api/public/v1/replies/threads/{thread_id}/reply",
    headers={"X-API-Key": api_key},
    json={
        "body": "Hi Jane, thanks for your interest! Happy to set up a call.",
        "html_body": "<p>Hi Jane, thanks for your interest! Happy to set up a call.</p>"
    }
)

result = response.json()
print(f"Message sent: {result['message_id']}")

Request Body

FieldTypeRequiredDescription
bodystringYesPlain text reply body
html_bodystringNoHTML version of the reply
attachmentsarrayNoFile attachments (max 5, 10 MB total)
Sending a reply automatically cancels any pending follow-up sequences for that lead within the campaign.

Mark Thread as Read

PATCH /api/public/v1/replies/threads/{thread_id}/read Marks a thread as read (or unread). Useful for syncing read state with your own CRM.
response = requests.patch(
    f"https://api.coldsend.pro/api/public/v1/replies/threads/{thread_id}/read",
    headers={"X-API-Key": api_key}
)

Star / Unstar a Thread

PATCH /api/public/v1/replies/threads/{thread_id}/star Toggles the starred state of a thread.
response = requests.patch(
    f"https://api.coldsend.pro/api/public/v1/replies/threads/{thread_id}/star",
    headers={"X-API-Key": api_key}
)

Required Scopes

OperationRequired Scope
List conversations, get thread details, get messagesreplies:read
Send a replyreplies:create
Mark as read, star/unstarreplies:update
All reply operationsreplies:all