Skip to main content

Support Tickets

Create, filter, assign and move support tickets through their lifecycle, with server-managed response and resolution stamps.

Overview

A ticket is one unit of support work. It can stand alone, or hang off a conversation and a contact so an agent sees the thread that produced it.

The lifecycle timestamps — first_responded_at, resolved_at, closed_at, reopened_count — are server-managed. You never send them; you change status and the API stamps the rest. That is what makes the SLA endpoints and CSAT reporting trustworthy.

Authentication

Authorization: Bearer cm_your_api_key
OperationScope
List, getsupport_tickets:read
Create, update, assign, status, deletesupport_tickets:write

Enumerations

FieldValues
statusopen, pending, waiting_on_customer, resolved, closed
prioritylow, normal, high, urgent

resolved and closed are the terminal statuses; the other three are active.

The ticket object

{
  "id": "e5d4…",
  "tenant_id": "a0b1…",
  "conversation_id": "c0ff…",
  "contact_id": "4411…",
  "subject": "Refund not received",
  "description": "Customer says the refund has not landed after 7 days.",
  "status": "open",
  "priority": "high",
  "assignee_user_id": null,
  "tags": ["billing", "refund"],
  "first_responded_at": null,
  "resolved_at": null,
  "closed_at": null,
  "reopened_count": 0,
  "created_at": "2026-08-17T06:10:00Z",
  "updated_at": "2026-08-17T06:10:00Z"
}
FieldTypeNotes
assignee_user_idUUID | nullnull means the ticket is in the unassigned queue
tagsstring[] | nullTrimmed, blanks dropped, de-duplicated, order preserved
first_responded_atdatetime | nullStamped once, the first time the ticket leaves open. Never re-stamped
resolved_atdatetime | nullStamped on the move to resolved
closed_atdatetime | nullStamped on the move to closed
reopened_countintegerIncremented each time a terminal ticket returns to an active status

GET /api/v1/support/tickets

Newest first.

ParameterTypeRequiredConstraints
statusstringNoOne of the five statuses
prioritystringNoOne of the four priorities
assignee_user_idUUIDNoOne agent's queue
contact_idUUIDNo
conversation_idUUIDNo
unassignedbooleanNotrue = no assignee, false = has one. Cannot be combined with assignee_user_id
qstringNoAt most 255 characters. Case-insensitive substring on subject
limitintegerNo1 <= limit <= 200, default 50
offsetintegerNo0 <= offset <= 100000, default 0
curl "https://api.callmissed.com/api/v1/support/tickets?status=open&unassigned=true&limit=50" \
  -H "Authorization: Bearer cm_your_api_key"

Sending both unassigned=true and assignee_user_id returns 422 unassigned=true cannot be combined with assignee_user_id — the two contradict each other, so the API refuses rather than silently picking one.

POST /api/v1/support/tickets

FieldTypeRequiredConstraints
subjectstringYes1–255 characters, not blank
descriptionstringNoAt most 20,000 characters
conversation_idUUIDNoMust exist in your tenant
contact_idUUIDNoMust exist in your tenant
assignee_user_idUUIDNoMust be a user in your tenant
statusstringNoDefault open
prioritystringNoDefault normal
tagsstring[]NoAt most 20 tags, each at most 64 characters
curl -X POST https://api.callmissed.com/api/v1/support/tickets \
  -H "Authorization: Bearer cm_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Refund not received",
    "description": "Customer says the refund has not landed after 7 days.",
    "conversation_id": "c0ffee00-1111-2222-3333-444455556666",
    "priority": "high",
    "tags": ["billing", "refund"]
  }'

Returns 201. Creating a ticket directly as resolved or closed stamps the matching timestamp immediately.

404 Conversation not found / Contact not found / Assignee not found when a linked id is not in your tenant.

GET /api/v1/support/tickets/{ticket_id}

One ticket. 404 Ticket not found.

PATCH /api/v1/support/tickets/{ticket_id}

Accepts the same editable fields as create. The lifecycle timestamps and reopened_count are not accepted — a status change here runs the same transition rules as the dedicated status endpoint.

subject sent as blank or null returns 422 subject must not be blank. An explicit null for status or priority is ignored rather than written.

POST /api/v1/support/tickets/{ticket_id}/assign

FieldTypeRequiredNotes
assignee_user_idUUID | nullNonull unassigns and returns the ticket to the queue

POST /api/v1/support/tickets/{ticket_id}/status

FieldTypeRequiredConstraints
statusstringYesOne of the five statuses

Idempotent. Sending the status the ticket already has returns it untouched — no re-stamp, no reopened_count increment. Safe to retry.

Transition rules

MoveEffect
Same statusNo-op
→ resolvedStamps resolved_at if unset, clears closed_at
→ closedStamps closed_at, leaves resolved_at alone
Terminal → activeClears both stamps, reopened_count += 1
Leaving open for the first timeStamps first_responded_at once

DELETE /api/v1/support/tickets/{ticket_id}

Returns 204. 404 Ticket not found.

Errors

StatusWhen
403Key is missing support_tickets:read / support_tickets:write
404Ticket, conversation, contact or assignee is not in your tenant
422Unknown status/priority, blank subject, or unassigned combined with assignee_user_id

Nothing on this page consumes credits.