Support
The Support module manages workspace support queues, customer tickets, public conversations, internal notes, assignments, priorities, and SLA targets.
What it does
Support is an app-plane module. It stores business support state inside the same tenant and workspace boundary as CRM, Tasks, Assets, Activity Log, CMS, and analytics data.
Use Support when a customer issue needs to become structured operational state:
- Create queues or inboxes for product, billing, onboarding, or VIP support.
- Create support tickets with status, priority, source, category, tags, assignee, owner, and SLA due dates.
- Link tickets to contacts, companies, deals, leads, invoices, related tasks, related assets, and activity records.
- Add public ticket messages for customer conversations.
- Add internal ticket comments for private triage notes.
- Query
custom_fieldsJSON for workspace-specific routing, customer segment, environment, or product area.
Resource model
Core resources:
| Resource | Purpose |
|---|---|
support_queues | Queue or inbox configuration, default priority, default assignee, and response or resolution targets. |
support_tickets | The case record for a customer issue, request, incident, or escalation. |
support_ticket_messages | Customer-visible or internal conversation messages with direction, visibility, channel, author, and timestamp. |
support_ticket_comments | Internal notes for triage, investigation, escalation, or handoff. |
Ticket statuses:
newopenpendingwaiting_on_customerresolvedclosed
Ticket priorities:
lownormalhighurgent
Tickets can store customer and revenue links through contact_id, company_id, deal_id, lead_id, and invoice_id. Related tasks, assets, and activities link from their own related_resource_type and related_resource_id fields using support_ticket.
REST surface
Support REST endpoints live under /v1/support/...:
GET /v1/support/queuesPOST /v1/support/queuesGET /v1/support/ticketsPOST /v1/support/ticketsPATCH /v1/support/tickets/{ticket_id}GET /v1/support/tickets/{ticket_id}/messagesPOST /v1/support/tickets/{ticket_id}/messagesGET /v1/support/tickets/{ticket_id}/commentsPOST /v1/support/tickets/{ticket_id}/comments
All routes require the Support module to be enabled for the workspace before scope checks can succeed.
Permissions
Use support:read to list queues, tickets, messages, and comments. Use support:write to create queues, create or update tickets, add customer-visible messages, and add internal comments.
Recommended scoped agent credentials for support handoff:
support:read
support:write
crm:read
tasks:write
assets:read
activity:write
Add crm:write only when the agent is allowed to create or update contacts, companies, leads, deals, invoices, payments, or accounting records while handling support work.
Example workflow
Prompt:
A customer reported that their April invoice is wrong. Create an urgent billing support ticket, add the customer email as the first message, add an internal note for finance, create an owner task, link the invoice and screenshot asset, and log the handoff.
Expected operations:
list_support_queuesto find the billing queue.create_support_ticketwithpriority: urgent, invoice or customer links, tags, SLA due dates, andcustom_fields.add_support_ticket_messagewith the inbound customer message.add_support_ticket_commentwith private finance context.create_tasklinked to the support ticket.search_assetsorcreate_asset_upload_intentfor the screenshot or invoice attachment.log_activitylinked to the support ticket or company.
Audit and usage
Support writes create audit events and usage events with request IDs. Use the request ID to connect a REST or MCP call to the ticket change, internal comment, task, asset link, activity log entry, and billing meter event.
Tenant and workspace isolation applies to every support read and write. A token for one workspace cannot list another workspace's tickets, even if the same WorkOS user belongs to both Teams.
MCP tools
create_support_queue
Create a support queue or inbox with default assignment and SLA targets.
- Required scopes
- support:write
- API equivalent
- POST /v1/support/queues
Example prompt
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
| key | string | Yes | No description yet. |
| name | string | Yes | No description yet. |
| description | string | No | No description yet. |
| status | string · active | paused | archived | No | No description yet. |
| default_assignee_id | string | No | No description yet. |
| default_priority | string · low | normal | high | urgent | No | No description yet. |
| first_response_target_minutes | integer · min 0 | No | No description yet. |
| next_response_target_minutes | integer · min 0 | No | No description yet. |
| resolution_target_minutes | integer · min 0 | No | No description yet. |
| custom_fields | object | No | User-defined queryable JSON fields. |
| idempotency_key | string | No | No description yet. |
Additional properties are rejected.
Example input
{
"key": "priority",
"name": "Priority Support",
"first_response_target_minutes": 120
}Example response
{
"queue": {
"id": "queue_123",
"key": "priority"
},
"request_id": "req_300"
}Common errors
The token does not include the scope required for this operation.
The request payload failed schema validation.
The idempotency key was reused with a different request body.
list_support_queues
List support queues by status, search text, or custom field.
- Required scopes
- support:read
- API equivalent
- GET /v1/support/queues
Example prompt
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
| query | string | No | No description yet. |
| status | string · active | paused | archived | No | No description yet. |
| custom_field_key | string | No | No description yet. |
| custom_field_value | string | No | No description yet. |
| limit | integer · min 1 · max 100 | No | No description yet. |
| cursor | string | No | No description yet. |
Additional properties are rejected.
Example input
{
"status": "active",
"limit": 10
}Example response
{
"queues": [
{
"id": "queue_123",
"name": "Priority Support"
}
],
"request_id": "req_301"
}Common errors
The token does not include the scope required for this operation.
The request payload failed schema validation.
create_support_ticket
Create a support ticket linked to customers, CRM records, invoices, and SLA targets.
- Required scopes
- support:write
- API equivalent
- POST /v1/support/tickets
Example prompt
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
| ticket_number | string | No | No description yet. |
| subject | string | Yes | No description yet. |
| description | string | No | No description yet. |
| status | string · new | open | pending | waiting_on_customer | No | No description yet. |
| priority | string · low | normal | high | urgent | No | No description yet. |
| source | string · manual | email | chat | phone | web | api | mcp | slack | other | No | No description yet. |
| category | string | No | No description yet. |
| tags | array | No | No description yet. |
| queue_id | string | No | No description yet. |
| assignee_id | string | No | No description yet. |
| owner_id | string | No | No description yet. |
| contact_id | string | No | No description yet. |
| company_id | string | No | No description yet. |
| deal_id | string | No | No description yet. |
| lead_id | string | No | No description yet. |
| invoice_id | string | No | No description yet. |
| external_reference | string | No | No description yet. |
| first_response_due_at | string · date-time | No | No description yet. |
| next_response_due_at | string · date-time | No | No description yet. |
| resolution_due_at | string · date-time | No | No description yet. |
| custom_fields | object | No | User-defined queryable JSON fields. |
| idempotency_key | string | No | No description yet. |
Additional properties are rejected.
Example input
{
"subject": "Customer cannot download invoice",
"priority": "urgent",
"category": "billing"
}Example response
{
"ticket": {
"id": "ticket_123",
"subject": "Customer cannot download invoice",
"status": "new"
},
"request_id": "req_302"
}Common errors
The token does not include the scope required for this operation.
The request payload failed schema validation.
The requested resource does not exist in this workspace.
The idempotency key was reused with a different request body.
list_support_tickets
List support tickets by status, priority, queue, owner, customer links, search text, or custom field.
- Required scopes
- support:read
- API equivalent
- GET /v1/support/tickets
Example prompt
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
| query | string | No | No description yet. |
| status | string · new | open | pending | waiting_on_customer | resolved | closed | No | No description yet. |
| priority | string · low | normal | high | urgent | No | No description yet. |
| source | string · manual | email | chat | phone | web | api | mcp | slack | other | No | No description yet. |
| category | string | No | No description yet. |
| queue_id | string | No | No description yet. |
| assignee_id | string | No | No description yet. |
| contact_id | string | No | No description yet. |
| company_id | string | No | No description yet. |
| deal_id | string | No | No description yet. |
| lead_id | string | No | No description yet. |
| invoice_id | string | No | No description yet. |
| custom_field_key | string | No | No description yet. |
| custom_field_value | string | No | No description yet. |
| limit | integer · min 1 · max 100 | No | No description yet. |
| cursor | string | No | No description yet. |
Additional properties are rejected.
Example input
{
"status": "open",
"priority": "urgent",
"limit": 10
}Example response
{
"tickets": [
{
"id": "ticket_123",
"priority": "urgent"
}
],
"request_id": "req_303"
}Common errors
The token does not include the scope required for this operation.
The request payload failed schema validation.
update_support_ticket
Update support ticket status, priority, queue, assignment, tags, category, SLA targets, or custom fields.
- Required scopes
- support:write
- API equivalent
- PATCH /v1/support/tickets/{ticket_id}
Example prompt
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
| ticket_id | string | Yes | No description yet. |
| status | string · new | open | pending | waiting_on_customer | resolved | closed | No | No description yet. |
| priority | string · low | normal | high | urgent | No | No description yet. |
| queue_id | string | No | No description yet. |
| assignee_id | string | No | No description yet. |
| owner_id | string | No | No description yet. |
| category | string | No | No description yet. |
| tags | array | No | No description yet. |
| first_response_due_at | string · date-time | No | No description yet. |
| next_response_due_at | string · date-time | No | No description yet. |
| resolution_due_at | string · date-time | No | No description yet. |
| custom_fields | object | No | No description yet. |
| idempotency_key | string | No | No description yet. |
Additional properties are rejected.
Example input
{
"ticket_id": "ticket_123",
"status": "open",
"queue_id": "queue_123"
}Example response
{
"ticket": {
"id": "ticket_123",
"status": "open"
},
"request_id": "req_304"
}Common errors
The token does not include the scope required for this operation.
The request payload failed schema validation.
The requested resource does not exist in this workspace.
add_support_ticket_message
Add an inbound, outbound, or internal message to a support ticket conversation.
- Required scopes
- support:write
- API equivalent
- POST /v1/support/tickets/{ticket_id}/messages
Example prompt
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
| ticket_id | string | Yes | No description yet. |
| direction | string · inbound | outbound | internal | No | No description yet. |
| visibility | string · public | internal | No | No description yet. |
| channel | string · manual | email | chat | phone | web | api | mcp | slack | other | No | No description yet. |
| subject | string | No | No description yet. |
| body | string | Yes | No description yet. |
| author_name | string | No | No description yet. |
| author_email | string | No | No description yet. |
| external_message_id | string | No | No description yet. |
| occurred_at | string · date-time | No | No description yet. |
| custom_fields | object | No | No description yet. |
| idempotency_key | string | No | No description yet. |
Additional properties are rejected.
Example input
{
"ticket_id": "ticket_123",
"direction": "inbound",
"channel": "email",
"body": "I still cannot access the invoice."
}Example response
{
"message": {
"id": "msg_123",
"ticket_id": "ticket_123"
},
"request_id": "req_305"
}Common errors
The token does not include the scope required for this operation.
The request payload failed schema validation.
The requested resource does not exist in this workspace.
The idempotency key was reused with a different request body.
list_support_ticket_messages
List conversation messages for a support ticket.
- Required scopes
- support:read
- API equivalent
- GET /v1/support/tickets/{ticket_id}/messages
Example prompt
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
| ticket_id | string | Yes | No description yet. |
| query | string | No | No description yet. |
| custom_field_key | string | No | No description yet. |
| custom_field_value | string | No | No description yet. |
| limit | integer · min 1 · max 100 | No | No description yet. |
| cursor | string | No | No description yet. |
Additional properties are rejected.
Example input
{
"ticket_id": "ticket_123",
"limit": 25
}Example response
{
"messages": [
{
"id": "msg_123",
"body": "I still cannot access the invoice."
}
],
"request_id": "req_306"
}Common errors
The token does not include the scope required for this operation.
The request payload failed schema validation.
The requested resource does not exist in this workspace.
add_support_ticket_comment
Add an internal note or pinned comment to a support ticket.
- Required scopes
- support:write
- API equivalent
- POST /v1/support/tickets/{ticket_id}/comments
Example prompt
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
| ticket_id | string | Yes | No description yet. |
| body | string | Yes | No description yet. |
| pinned | boolean | No | No description yet. |
| custom_fields | object | No | No description yet. |
| idempotency_key | string | No | No description yet. |
Additional properties are rejected.
Example input
{
"ticket_id": "ticket_123",
"body": "Finance is checking the invoice export.",
"pinned": true
}Example response
{
"comment": {
"id": "comment_123",
"pinned": true
},
"request_id": "req_307"
}Common errors
The token does not include the scope required for this operation.
The request payload failed schema validation.
The requested resource does not exist in this workspace.
The idempotency key was reused with a different request body.
list_support_ticket_comments
List internal comments and notes for a support ticket.
- Required scopes
- support:read
- API equivalent
- GET /v1/support/tickets/{ticket_id}/comments
Example prompt
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
| ticket_id | string | Yes | No description yet. |
| query | string | No | No description yet. |
| custom_field_key | string | No | No description yet. |
| custom_field_value | string | No | No description yet. |
| limit | integer · min 1 · max 100 | No | No description yet. |
| cursor | string | No | No description yet. |
Additional properties are rejected.
Example input
{
"ticket_id": "ticket_123",
"limit": 25
}Example response
{
"comments": [
{
"id": "comment_123",
"body": "Finance is checking the invoice export."
}
],
"request_id": "req_308"
}Common errors
The token does not include the scope required for this operation.
The request payload failed schema validation.
The requested resource does not exist in this workspace.
