POST /api/v2/conversations/messaging/... sending canned response returns 400 BAD_REQUEST

We’re trying to automate canned response injection into active web messaging sessions from our Kotlin backend. The goal is to allow supervisors to push pre-approved snippets without the agent typing them manually. We’re using the POST /api/v2/conversations/messaging/{conversationId}/messages endpoint. The request body looks like this:

{
 "from": {
 "id": "supervisor_user_id_here",
 "name": "Supervisor Bot"
 },
 "text": "Here is the standard policy update."
}

The response is consistently a 400 BAD_REQUEST with error code INVALID_VALUE. The message says Text message cannot be empty, but the payload clearly has text. We’ve verified the conversationId is valid and the session is still active. Using curl directly gives the same result. Is there a specific flag or content-type header required for canned responses that isn’t documented? Or does the Web Messaging SDK handle this differently than the raw REST API? We’re using the standard Bearer token auth flow.