Files
gochat/docs/swagger.yaml
T
2026-06-04 15:44:48 +08:00

2344 lines
60 KiB
YAML

definitions:
gorm.DeletedAt:
properties:
time:
type: string
valid:
description: Valid is true if Time is not NULL
type: boolean
type: object
model.Account:
properties:
active:
type: boolean
auto_resolve_duration:
description: days
type: integer
created_at:
type: string
deleted_at:
$ref: '#/definitions/gorm.DeletedAt'
domain:
type: string
feature_flags:
description: JSON-encoded feature flags
type: string
id:
type: integer
locale:
type: string
name:
type: string
status:
type: string
timezone:
type: string
updated_at:
type: string
type: object
model.Contact:
properties:
account_id:
type: integer
additional_attributes:
items:
type: integer
type: array
avatar_url:
type: string
blocked:
type: boolean
company_id:
type: integer
contact_type:
type: string
country_code:
type: string
created_at:
type: string
custom_attributes:
items:
type: integer
type: array
deleted_at:
$ref: '#/definitions/gorm.DeletedAt'
email:
type: string
id:
type: integer
identifier:
type: string
last_activity_at:
type: integer
last_name:
type: string
location:
type: string
middle_name:
type: string
name:
type: string
phone_number:
type: string
source_id:
type: string
updated_at:
type: string
type: object
model.Conversation:
properties:
account_id:
type: integer
additional_attributes:
items:
type: integer
type: array
agent_last_seen_at:
type: integer
assignee_id:
type: integer
assignee_last_seen_at:
type: integer
campaign_id:
type: integer
channel:
description: channel identifier for routing
type: string
channel_type:
type: string
contact_id:
type: integer
contact_inbox_id:
type: integer
contact_last_seen_at:
type: integer
created_at:
type: string
custom_attributes:
items:
type: integer
type: array
deleted_at:
$ref: '#/definitions/gorm.DeletedAt'
display_id:
description: account-level auto-increment number
type: integer
first_reply_created_at:
type: integer
id:
type: integer
inbox_id:
type: integer
labels:
description: comma-separated or JSON label list
type: string
last_activity_at:
type: integer
last_message_at:
type: integer
last_non_system_message_at:
type: integer
muted:
type: boolean
priority:
description: none, low, medium, high, urgent
type: string
resolved_at:
description: 'Chatwoot: timestamp when conversation was resolved'
type: string
resumed_at:
description: 'Chatwoot: timestamp when conversation was reopened'
type: string
sla_policy_id:
type: integer
snoozed_until:
description: timestamp for snoozed conversations
type: integer
status:
description: open, resolved, pending, snoozed
type: string
team_id:
type: integer
updated_at:
type: string
uuid:
description: auto-generated global unique identifier
type: string
waiting_since:
type: integer
type: object
model.ErrorResponse:
properties:
error:
example: not_found
type: string
message:
example: Resource not found
type: string
type: object
model.Inbox:
properties:
account_id:
type: integer
allow_messages_after_resolved:
type: boolean
auto_assignment_limit:
type: integer
avatar_url:
description: URL to inbox avatar image
type: string
business_name:
type: string
channel_config:
description: JSON-encoded per-inbox channel configuration
type: string
channel_id:
type: integer
channel_type:
description: web_widget, facebook, twitter, whatsapp, telegram, email, api,
etc
type: string
created_at:
type: string
csat_config:
description: JSON-encoded CSAT survey configuration
type: string
csat_survey_enabled:
type: boolean
deleted_at:
$ref: '#/definitions/gorm.DeletedAt'
enable_auto_assignment:
type: boolean
enable_email_collect:
type: boolean
enabled:
type: boolean
greeting_enabled:
description: Chatwoot inbox settings (from permitted_params)
type: boolean
greeting_message:
type: string
id:
type: integer
lock_to_single_conversation:
type: boolean
name:
type: string
out_of_office_message:
type: string
portal_id:
description: FK to help-center portal (nullable)
type: integer
secret:
description: HMAC secret for API inbox webhook verification
type: string
sender_name_type:
description: friendly_name, business_name, random
type: string
timezone:
description: e.g. "Asia/Kolkata"
type: string
updated_at:
type: string
webhook_url:
description: API inbox specific fields
type: string
working_hours_enabled:
type: boolean
type: object
model.JSONMap:
additionalProperties: true
type: object
model.Message:
properties:
account_id:
type: integer
additional_attributes:
items:
type: integer
type: array
content:
type: string
content_attributes:
description: attachments, mentions, etc
items:
type: integer
type: array
content_type:
description: text, input, input_csat, file, image, etc
type: string
conversation_id:
type: integer
created_at:
type: string
deleted_at:
$ref: '#/definitions/gorm.DeletedAt'
external:
type: boolean
external_source_ids:
description: external platform IDs
items:
type: integer
type: array
id:
type: integer
inbox_id:
type: integer
message_type:
description: incoming, outgoing, activity, template
type: string
private:
type: boolean
sender_id:
type: integer
sender_type:
description: contact, agent, bot
type: string
source_id:
type: string
status:
description: sent, delivered, read, failed
type: string
updated_at:
type: string
type: object
search.SearchResponse:
properties:
by_type:
additionalProperties:
format: int64
type: integer
description: 'count per type: {"conversation":5,"message":12,...}'
type: object
page:
type: integer
per_page:
type: integer
query:
type: string
results:
items:
$ref: '#/definitions/search.SearchResult'
type: array
total_count:
description: total hits across all types
type: integer
type: object
search.SearchResult:
properties:
account_id:
type: integer
data:
description: full entity payload (Conversation, Message, Contact)
id:
type: integer
score:
description: relevance score (higher = more relevant)
type: number
snippet:
description: short excerpt for display
type: string
type:
$ref: '#/definitions/search.SearchResultType'
type: object
search.SearchResultType:
enum:
- conversation
- message
- contact
- article
type: string
x-enum-varnames:
- ResultTypeConversation
- ResultTypeMessage
- ResultTypeContact
- ResultTypeArticle
service.AssignAgentRequest:
properties:
assignee_id:
type: integer
required:
- assignee_id
type: object
service.CreateAccountRequest:
properties:
domain:
minLength: 3
type: string
locale:
type: string
name:
minLength: 2
type: string
required:
- name
type: object
service.CreateContactRequest:
properties:
additional_attributes:
$ref: '#/definitions/model.JSONMap'
avatar_url:
type: string
company_id:
type: integer
contact_type:
type: string
country_code:
type: string
custom_attributes:
$ref: '#/definitions/model.JSONMap'
email:
type: string
identifier:
type: string
inbox_id:
type: integer
last_name:
type: string
location:
type: string
middle_name:
type: string
name:
minLength: 1
type: string
phone:
type: string
source_id:
type: string
required:
- name
type: object
service.CreateInboxRequest:
properties:
channel_type:
enum:
- web_widget
- telegram
- facebook
- instagram
- whatsapp
- email
- api
- tiktok
- line
- twilio_sms
type: string
enable_auto_assignment:
type: boolean
enabled:
type: boolean
name:
minLength: 2
type: string
required:
- channel_type
- name
type: object
service.CreateMessageRequest:
properties:
content:
minLength: 1
type: string
content_type:
enum:
- text
- input_text
- input_email
- input_phone
- select
- card
- private_note
type: string
conversation_id:
type: integer
message_type:
enum:
- outgoing
- incoming
- activity
- template
- private_note
type: string
private:
type: boolean
source_id:
description: 'Chatwoot: source_id for message origin (user/agent/bot)'
type: string
required:
- content
- conversation_id
- message_type
type: object
service.ToggleStatusRequest:
properties:
assignee_id:
description: 'Chatwoot: auto-assign on reopen'
type: integer
is_bot:
description: 'Chatwoot: pending_to_open_by_bot — agent bot triggers handoff'
type: boolean
snoozed_until:
description: 'Chatwoot: snooze with wake-up time (unix timestamp)'
type: integer
status:
enum:
- open
- resolved
- pending
- snoozed
type: string
user_id:
description: 'Chatwoot: should_assign_conversation — auto-assign to agent
who opens'
type: integer
required:
- status
type: object
service.UpdateAccountRequest:
properties:
auto_resolve_duration:
minimum: 0
type: integer
domain:
minLength: 3
type: string
feature_flags:
type: string
locale:
type: string
name:
minLength: 2
type: string
status:
enum:
- active
- inactive
type: string
type: object
service.UpdateContactRequest:
properties:
additional_attributes:
$ref: '#/definitions/model.JSONMap'
avatar_url:
type: string
company_id:
type: integer
contact_type:
type: string
country_code:
type: string
custom_attributes:
$ref: '#/definitions/model.JSONMap'
email:
type: string
identifier:
type: string
last_name:
type: string
location:
type: string
middle_name:
type: string
name:
minLength: 1
type: string
phone:
type: string
type: object
service.UpdateInboxRequest:
properties:
enable_auto_assignment:
type: boolean
enabled:
type: boolean
name:
minLength: 2
type: string
type: object
info:
contact: {}
paths:
/api/v1/accounts:
get:
consumes:
- application/json
description: Returns all accounts the authenticated user has access to, with
pagination support
parameters:
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: page_size
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/model.Account'
type: array
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: List accounts accessible by the current user
tags:
- Accounts
post:
consumes:
- application/json
description: Creates a new account and assigns the creator as administrator
parameters:
- description: Account creation payload
in: body
name: body
required: true
schema:
$ref: '#/definitions/service.CreateAccountRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/model.Account'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Create a new account
tags:
- Accounts
/api/v1/accounts/{account_id}/conversations:
get:
consumes:
- application/json
description: Retrieves all conversations for an account with pagination, optionally
filtered by status query param
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Filter by conversation status (open/pending/resolved/snoozed)
in: query
name: status
type: string
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: page_size
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/model.Conversation'
type: array
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: List conversations for an account
tags:
- Conversations
/api/v1/accounts/{account_id}/conversations/{conversation_id}/messages:
get:
consumes:
- application/json
description: Retrieves all messages for a conversation with pagination
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Conversation ID
in: path
name: conversation_id
required: true
type: integer
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: page_size
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/model.Message'
type: array
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: List messages in a conversation
tags:
- Messages
post:
consumes:
- application/json
description: Creates a new message in an existing conversation
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Conversation ID
in: path
name: conversation_id
required: true
type: integer
- description: Message creation payload
in: body
name: body
required: true
schema:
$ref: '#/definitions/service.CreateMessageRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/model.Message'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Create a message in a conversation
tags:
- Messages
/api/v1/accounts/{account_id}/conversations/{conversation_id}/messages/{id}:
delete:
consumes:
- application/json
description: Soft-deletes a message from a conversation
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Conversation ID
in: path
name: conversation_id
required: true
type: integer
- description: Message ID
in: path
name: id
required: true
type: integer
produces:
- application/json
responses:
"204":
description: No Content
schema:
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Delete a message
tags:
- Messages
get:
consumes:
- application/json
description: Retrieves detailed information about a specific message
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Conversation ID
in: path
name: conversation_id
required: true
type: integer
- description: Message ID
in: path
name: id
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Message'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Get a single message
tags:
- Messages
/api/v1/accounts/{account_id}/conversations/{id}:
get:
consumes:
- application/json
description: Retrieves detailed information about a specific conversation within
an account
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Conversation ID
in: path
name: id
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Conversation'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Get a single conversation
tags:
- Conversations
/api/v1/accounts/{account_id}/conversations/{id}/assign:
post:
consumes:
- application/json
description: Assigns a specific agent to a conversation by providing the assignee
ID
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Conversation ID
in: path
name: id
required: true
type: integer
- description: Agent assignment payload
in: body
name: body
required: true
schema:
$ref: '#/definitions/service.AssignAgentRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Conversation'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Assign an agent to a conversation
tags:
- Conversations
/api/v1/accounts/{account_id}/conversations/{id}/assignments:
post:
consumes:
- application/json
description: Assigns a team (and optionally an agent) to a conversation
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Conversation ID
in: path
name: id
required: true
type: integer
- description: Team assignment payload
in: body
name: body
required: true
schema:
type: object
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Conversation'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Assign a team to a conversation
tags:
- Conversations
/api/v1/accounts/{account_id}/conversations/{id}/mute:
post:
consumes:
- application/json
description: Mutes a conversation to suppress notifications
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Conversation ID
in: path
name: id
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Conversation'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Mute a conversation
tags:
- Conversations
/api/v1/accounts/{account_id}/conversations/{id}/toggle_status:
post:
consumes:
- application/json
description: Toggles the status of a conversation between open, pending, resolved,
or snoozed
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Conversation ID
in: path
name: id
required: true
type: integer
- description: Status toggle payload
in: body
name: body
required: true
schema:
$ref: '#/definitions/service.ToggleStatusRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Conversation'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Toggle conversation status
tags:
- Conversations
/api/v1/accounts/{account_id}/conversations/{id}/unmute:
post:
consumes:
- application/json
description: Unmutes a conversation to restore notifications
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Conversation ID
in: path
name: id
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Conversation'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Unmute a conversation
tags:
- Conversations
/api/v1/accounts/{account_id}/conversations/search:
get:
consumes:
- application/json
description: Searches conversations by query string with pagination and search
mode support
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Search query
in: query
name: q
required: true
type: string
- default: prefix
description: Search mode (prefix/semantic/fulltext)
in: query
name: search_mode
type: string
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: page_size
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/model.Conversation'
type: array
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Search conversations
tags:
- Conversations
/api/v1/accounts/{account_id}/search:
get:
consumes:
- application/json
description: Searches across conversations, messages, contacts, and articles
with advanced filtering and pagination
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Search query string
in: query
name: q
type: string
- default: conversation,message,contact,article
description: Entity types to search (conversation,message,contact,article)
in: query
name: types
type: string
- default: ilike
description: 'Search mode: ilike (substring) or trigram (fuzzy)'
in: query
name: search_mode
type: string
- description: Conversation status filter (open,resolved,pending,snoozed)
in: query
name: status
type: string
- description: Conversation priority filter (none,low,medium,high,urgent)
in: query
name: priority
type: string
- description: Assignee agent ID filter
in: query
name: assignee_id
type: integer
- description: Team ID filter
in: query
name: team_id
type: integer
- description: Inbox ID filter
in: query
name: inbox_id
type: integer
- description: Label filter (comma-separated)
in: query
name: labels
type: string
- description: Contact source filter (email,phone,website,api)
in: query
name: contact_source
type: string
- description: Message type filter (incoming,outgoing,activity)
in: query
name: message_type
type: string
- description: Sender type filter
in: query
name: sender_type
type: string
- description: Content type filter (text,input_email,card)
in: query
name: content_type
type: string
- description: Private message filter
in: query
name: private
type: boolean
- description: Date range start (ISO 8601)
in: query
name: date_from
type: string
- description: Date range end (ISO 8601)
in: query
name: date_to
type: string
- description: Portal ID filter (for article search)
in: query
name: portal_id
type: integer
- description: Article status filter (draft,published,archived)
in: query
name: article_status
type: string
- description: Article locale filter
in: query
name: article_locale
type: string
- default: created_at
description: Sort field (created_at,last_activity_at,updated_at)
in: query
name: sort_by
type: string
- default: desc
description: Sort order (asc,desc)
in: query
name: sort_order
type: string
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: per_page
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/search.SearchResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Global search across all entity types
tags:
- Search
/api/v1/accounts/{account_id}/search/articles:
get:
consumes:
- application/json
description: Searches knowledge base articles by query string (title, description,
content) with portal, status, and locale filters
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Search query string
in: query
name: q
required: true
type: string
- default: ilike
description: 'Search mode: ilike (substring) or trigram (fuzzy)'
in: query
name: search_mode
type: string
- description: Portal ID filter
in: query
name: portal_id
type: integer
- description: Article status filter (draft,published,archived)
in: query
name: article_status
type: string
- description: Article locale filter (en,es,fr,de,pt,etc)
in: query
name: article_locale
type: string
- description: Author ID filter
in: query
name: author_id
type: integer
- default: created_at
description: Sort field (created_at,updated_at)
in: query
name: sort_by
type: string
- default: desc
description: Sort order (asc,desc)
in: query
name: sort_order
type: string
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: per_page
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
additionalProperties: true
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Search knowledge base articles
tags:
- Search
/api/v1/accounts/{account_id}/search/contacts:
get:
consumes:
- application/json
description: Searches contacts by query string (name, email, phone, identifier)
with advanced filtering
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Search query string
in: query
name: q
required: true
type: string
- default: ilike
description: 'Search mode: ilike (substring) or trigram (fuzzy)'
in: query
name: search_mode
type: string
- description: Contact source filter (email,phone,website,api)
in: query
name: contact_source
type: string
- default: created_at
description: Sort field (created_at,updated_at,name)
in: query
name: sort_by
type: string
- default: desc
description: Sort order (asc,desc)
in: query
name: sort_order
type: string
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: per_page
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
additionalProperties: true
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Search contacts
tags:
- Search
/api/v1/accounts/{account_id}/search/conversations:
get:
consumes:
- application/json
description: Searches conversations by query string with advanced filtering
(status, assignee, labels, date range)
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Search query string
in: query
name: q
required: true
type: string
- default: ilike
description: 'Search mode: ilike (substring) or trigram (fuzzy)'
in: query
name: search_mode
type: string
- description: Conversation status filter (open,resolved,pending,snoozed)
in: query
name: status
type: string
- description: Conversation priority filter (none,low,medium,high,urgent)
in: query
name: priority
type: string
- description: Assignee agent ID filter
in: query
name: assignee_id
type: integer
- description: Team ID filter
in: query
name: team_id
type: integer
- description: Inbox ID filter
in: query
name: inbox_id
type: integer
- description: Label filter (comma-separated)
in: query
name: labels
type: string
- description: Date range start (ISO 8601)
in: query
name: date_from
type: string
- description: Date range end (ISO 8601)
in: query
name: date_to
type: string
- default: created_at
description: Sort field (created_at,last_activity_at,updated_at)
in: query
name: sort_by
type: string
- default: desc
description: Sort order (asc,desc)
in: query
name: sort_order
type: string
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: per_page
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
additionalProperties: true
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Search conversations
tags:
- Search
/api/v1/accounts/{account_id}/search/messages:
get:
consumes:
- application/json
description: Searches messages by query string with advanced filtering (message
type, sender type, content type, private)
parameters:
- description: Account ID
in: path
name: account_id
required: true
type: integer
- description: Search query string
in: query
name: q
required: true
type: string
- default: ilike
description: 'Search mode: ilike (substring) or trigram (fuzzy)'
in: query
name: search_mode
type: string
- description: Message type filter (incoming,outgoing,activity)
in: query
name: message_type
type: string
- description: Sender type filter
in: query
name: sender_type
type: string
- description: Content type filter (text,input_email,card)
in: query
name: content_type
type: string
- description: Private message filter
in: query
name: private
type: boolean
- description: Inbox ID filter
in: query
name: inbox_id
type: integer
- description: Date range start (ISO 8601)
in: query
name: date_from
type: string
- description: Date range end (ISO 8601)
in: query
name: date_to
type: string
- default: created_at
description: Sort field (created_at,updated_at)
in: query
name: sort_by
type: string
- default: desc
description: Sort order (asc,desc)
in: query
name: sort_order
type: string
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: per_page
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
additionalProperties: true
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Search messages
tags:
- Search
/api/v1/accounts/{id}:
delete:
consumes:
- application/json
description: Soft-deletes an account by ID
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
produces:
- application/json
responses:
"204":
description: No Content
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Delete an account
tags:
- Accounts
get:
consumes:
- application/json
description: Retrieves detailed information about a specific account
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Account'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Get a single account by ID
tags:
- Accounts
put:
consumes:
- application/json
description: Modifies account details such as name and settings
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- description: Account update payload
in: body
name: body
required: true
schema:
$ref: '#/definitions/service.UpdateAccountRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Account'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Update an existing account
tags:
- Accounts
/api/v1/accounts/{id}/contacts:
get:
consumes:
- application/json
description: Retrieves all contacts for an account with pagination and optional
sort
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- default: name
description: Sort field
in: query
name: sort
type: string
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: page_size
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/model.Contact'
type: array
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: List contacts for an account
tags:
- Contacts
post:
consumes:
- application/json
description: Creates a new contact, optionally auto-creating a ContactInbox
when inbox_id is provided
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- description: Contact creation payload
in: body
name: body
required: true
schema:
$ref: '#/definitions/service.CreateContactRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/model.Contact'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Create a new contact
tags:
- Contacts
/api/v1/accounts/{id}/contacts/{contact_id}:
delete:
consumes:
- application/json
description: Soft-deletes a contact from an account
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- description: Contact ID
in: path
name: contact_id
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Delete a contact
tags:
- Contacts
get:
consumes:
- application/json
description: Retrieves detailed information about a specific contact within
an account
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- description: Contact ID
in: path
name: contact_id
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Contact'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Get a single contact
tags:
- Contacts
put:
consumes:
- application/json
description: Modifies an existing contact's details
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- description: Contact ID
in: path
name: contact_id
required: true
type: integer
- description: Contact update payload
in: body
name: body
required: true
schema:
$ref: '#/definitions/service.UpdateContactRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Contact'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Update a contact
tags:
- Contacts
/api/v1/accounts/{id}/contacts/search:
get:
consumes:
- application/json
description: Searches contacts by query string with pagination, sort, and search
mode support
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- description: Search query
in: query
name: q
required: true
type: string
- description: Sort field
in: query
name: sort
type: string
- default: prefix
description: Search mode (prefix/semantic/fulltext)
in: query
name: search_mode
type: string
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: page_size
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/model.Contact'
type: array
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Search contacts
tags:
- Contacts
/api/v1/accounts/{id}/inboxes:
get:
consumes:
- application/json
description: Retrieves all inboxes for an account with pagination
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- default: 1
description: Page number
in: query
name: page
type: integer
- default: 25
description: Items per page
in: query
name: page_size
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/model.Inbox'
type: array
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: List inboxes for an account
tags:
- Inboxes
post:
consumes:
- application/json
description: Creates a new inbox for an account
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- description: Inbox creation payload
in: body
name: body
required: true
schema:
$ref: '#/definitions/service.CreateInboxRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/model.Inbox'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Create a new inbox
tags:
- Inboxes
/api/v1/accounts/{id}/inboxes/{inbox_id}:
delete:
consumes:
- application/json
description: Deletes an inbox from an account
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- description: Inbox ID
in: path
name: inbox_id
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Delete an inbox
tags:
- Inboxes
get:
consumes:
- application/json
description: Retrieves detailed information about a specific inbox within an
account
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- description: Inbox ID
in: path
name: inbox_id
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Inbox'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Get a single inbox
tags:
- Inboxes
put:
consumes:
- application/json
description: Updates an existing inbox's configuration
parameters:
- description: Account ID
in: path
name: id
required: true
type: integer
- description: Inbox ID
in: path
name: inbox_id
required: true
type: integer
- description: Inbox update payload
in: body
name: body
required: true
schema:
$ref: '#/definitions/service.UpdateInboxRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.Inbox'
"400":
description: Bad Request
schema:
$ref: '#/definitions/model.ErrorResponse'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/model.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/model.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/model.ErrorResponse'
security:
- ApiKeyAuth: []
summary: Update an inbox
tags:
- Inboxes
swagger: "2.0"