Guest API POST 400 on message payload without widget

Trying to bypass the Messenger widget entirely and post messages directly via the Guest API. The initial handshake works fine, but POSTing to /api/v2/conversations/messaging/sessions/{session_id}/messages fails with a 400 Bad Request. Payload is standard JSON with text and from fields. No error details in the response body.

{
 "text": "Hello",
 "from": { "id": "guest-123" }
}

Missing something obvious in the auth header or session state?