---
title: "Send a message from a case"
method: POST
path: "/contact_cases/{id}/messages"
tags: ["Case"]
---

# Send a message from a case

`POST /contact_cases/{id}/messages`

Send a message from a known, open case with an explicit source and
destination address (design §4.5). Validation order:
  1. Case validation -- case belongs to the calling customer and is
     status=open (closed cases must be reopened via POST
     /v1.0/contact_cases/{id}/continue first).
  2. Destination-to-case binding -- destination must be attributable
     to this specific case (matched Contact's addresses, or the
     case's bare peer_target when unresolved). Failure of either
     sub-check returns the same generic error, by design, to prevent
     a caller from using case_id as a bare capability token to probe
     which binding sub-case failed.
  3. Source-ownership validation -- source must be an active, normal
     number owned by this case's customer.
The message is sent through the same underlying conversation-message
send path as POST /v1.0/service_agents/conversations/{id}/messages,
reusing the ConversationManagerMessage response schema.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `source` string, required — The business's own number to send from. Must be an active, normal number owned by this case's customer.
  - `destination` string, required — The customer's number to send to. Must be attributable to this case (the matched Contact's address, or the case's peer_target).
  - `text` string, required — The text content of the message.

## Response `200`

The details of the sent message.

- ConversationManagerMessage
  - `id` string, uuid — The unique identifier of the message.
  - `customer_id` string, uuid — The unique identifier of the customer. Returned from the `GET /customers` response.
  - `conversation_id` string, uuid — The unique identifier of the conversation. Returned from the `GET /conversations` response.
  - `direction` 'outgoing' | 'incoming' — Direction of the message (incoming or outgoing).
  - `status` 'progressing' | 'done' | 'failed' — Delivery status of the message.
  - `reference_type` '' | 'message' | 'line' | 'whatsapp' | 'email' — Source channel that produced the message.
  - `reference_id` string, uuid — The unique identifier of the referenced resource. The actual resource type is determined by reference_type. Returned from the corresponding resource endpoint.
  - `source` CommonAddress — Contains source or destination detail info.
    - `type` '' | 'agent' | 'conference' | 'email' | 'extension' | 'line' | 'sip' | 'tel' | 'web_session' — Type of address.
    - `target` string — The address endpoint. Format depends on type: phone number for tel (e.g. +14155551234), UUID for agent/conference/extension, email for email, SIP URI for sip.
    - `target_name` string — Address's name.
    - `name` string — Optional label for this address.
    - `detail` string — Additional notes about this address.
  - `destination` CommonAddress — Contains source or destination detail info.
    - `type` '' | 'agent' | 'conference' | 'email' | 'extension' | 'line' | 'sip' | 'tel' | 'web_session' — Type of address.
    - `target` string — The address endpoint. Format depends on type: phone number for tel (e.g. +14155551234), UUID for agent/conference/extension, email for email, SIP URI for sip.
    - `target_name` string — Address's name.
    - `name` string — Optional label for this address.
    - `detail` string — Additional notes about this address.
  - `text` string — The message content.
  - `medias` ConversationManagerMedia[] — List of media associated with the message.
    - `id` string, uuid — The unique identifier of the media.
    - `customer_id` string, uuid — The unique identifier of the customer. Returned from the `GET /customers` response.
    - `type` 'image' | 'video' | 'audio' | 'file' | 'location' | 'sticker' | 'template' | 'imagemap' | 'flex' — Type of the media.
    - `filename` string — Filename of the media.
    - `tm_create` string, date-time — Timestamp when the media was created.
    - `tm_update` string, date-time — Timestamp when the media was last updated.
    - `tm_delete` string, date-time — Timestamp when the media was deleted.
  - `tm_create` string, date-time — Timestamp when the message was created.
  - `tm_update` string, date-time — Timestamp when the message was last updated.
  - `tm_delete` string, date-time — Timestamp when the message was deleted.

## Other responses

- `400` — Invalid request (INVALID_ARGUMENT).
- `401` — Authentication required (UNAUTHENTICATED).
- `403` — Insufficient permission (PERMISSION_DENIED).
- `404` — Resource not found (NOT_FOUND).
- `409` — State conflict (ALREADY_EXISTS or FAILED_PRECONDITION).
- `500` — Internal error (INTERNAL).

---

[API](https://skmtc.net/voipbin/apis/voipbin-api.md) · [All operations](https://skmtc.net/voipbin/apis/voipbin-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/voipbin/voipbin-api/versions/79e779080bcc/schema)
