Open Messaging API: Quick Reply buttons returning 400 Bad Request with 'invalid payload structure'

We’re trying to send structured messages (cards with quick replies) via the Genesys Cloud Open Messaging API to enhance our bot flows. The goal is to inject our OpenTelemetry trace context into the request headers so we can correlate these specific user interactions with backend service calls in Jaeger.

The basic text messages work fine. But as soon as we switch to a structured payload with type: "card" and quick_replies, the API returns a 400 Bad Request.

Here’s the JSON body we’re sending to POST /api/v2/conversations/messaging/{conversationId}/messages:

{
 "text": "Select an option:",
 "type": "card",
 "card": {
 "title": "Support Options",
 "description": "Choose one of the following",
 "quick_replies": [
 {
 "title": "Check Status",
 "value": "status_check"
 },
 {
 "title": "Speak to Agent",
 "value": "agent_transfer"
 }
 ]
 }
}

The error response is generic:

{
 "errors": [
 {
 "code": "invalid_request",
 "message": "The request payload is invalid."
 }
 ]
}

I’ve checked the API docs for Messaging Messages. The schema seems to match, but maybe I’m missing a required wrapper or the quick_replies array needs a different structure.

Here’s what I’ve tried so far:

  • Sending the payload without the card wrapper, just type: "quick_replies" at the root level. Still 400.
  • Removing the description field from the card. No change.
  • Using the Python SDK’s create_messaging_message method with the same data structure. Same error.
  • Verified the conversationId is valid and the conversation is active.
  • Added our traceparent header to the request. The 400 still happens, so it’s not an auth or tracing issue.

Is there a specific format for the quick_replies inside a card that I’m missing? Or is this endpoint not actually supporting structured cards yet? The docs are a bit sparse on the exact JSON schema for the card body.