:::endpoint POST /v1/me/ai/conversations/{id}/messages

The next question in a conversation. The assistant reads the conversation so
far with it. Like [the first question](/docs/api/apps/ai-conversation-create)
the response comes back before the answer is written, with the question and the
empty answer to draw.

One answer at a time per conversation. While one is still being written, a
new question answers `409 ai_answer_in_progress`. Wait for its `turn_state` to
leave `streaming`, or [stop it](/docs/api/apps/ai-cancel), and ask again. An
answer still marked as being written after five minutes belongs to a worker
that died, and is closed as failed when the next question comes.

The body is the same as for a new question: `message`, and up to five files in
`attachments`.

## Request

```bash
curl -X POST https://api.proppertrading.com/v1/me/ai/conversations/01a16152-7e42-70cd-91a4-b6b80ee47daa/messages \
  -H "Authorization: Bearer ptat_9f2c1a44_3b8e7d2f5c9a1b4e6d8f0a2c4e6b8d1f" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 0b9d4e7a-5c21-4f83-a6d0-7e2c9b1f4a35" \
  -d '{"message": "And how much drawdown do I have left overall?"}'
```

## Response

`202`, the question is stored and the answer is on its way:

```json
{
    "data": {
        "object": "ai_turn",
        "conversation": {
            "id": "01a16152-7e42-70cd-91a4-b6b80ee47daa",
            "object": "ai_conversation",
            "title": null,
            "pinned": false,
            "surface": "trader_chat",
            "channel": "private-ai-chat.01a16152-7e42-70cd-91a4-b6b80ee47daa",
            "last_message_at": "2026-10-22T01:56:47+00:00",
            "created_at": "2026-10-22T01:55:58+00:00"
        },
        "question": {
            "id": "aimsg_cukccxsj98gvv2mb",
            "object": "ai_message",
            "role": "user",
            "content": "And how much drawdown do I have left overall?",
            "status": "complete",
            "attachments": [],
            "actions": [],
            "created_at": "2026-10-22T01:56:47+00:00"
        },
        "answer": {
            "id": "aimsg_yrf25cr33ju3zuc2",
            "object": "ai_message",
            "role": "assistant",
            "content": "",
            "status": "streaming",
            "attachments": [],
            "actions": [],
            "created_at": "2026-10-22T01:56:47+00:00"
        }
    },
    "meta": {
        "request_id": "req_01m5gn6fccrdjv0pn7dnx049fy"
    }
}
```

## Errors

| Status | Code | Meaning |
| ------ | ---- | ------- |
| 400 | `invalid_attachment` | A file's `data` is not base64, or it is empty |
| 400 | `attachment_too_large` | A file over 10 MB once decoded |
| 400 | `missing_idempotency_key` | Every POST needs one |
| 400 | `workspace_required` | Our own staff, without a firm in `Propper-Workspace` |
| 403 | `ai_unavailable` | The firm has the assistant switched off for this chat |
| 403 | `ai_kyc_required` | A trader whose account is locked until the identity check is done |
| 403 | `forbidden` | Staff whose role does not include `use_ai_chat` |
| 403 | `insufficient_scope` | This device does not hold `ai:write` |
| 404 | `resource_not_found` | No conversation of yours with that id in this chat and this firm |
| 409 | `ai_answer_in_progress` | The previous answer is still being written |
| 422 | `validation_failed` | No `message`, one over 4000 characters, more than five files, or a file of a type that is not allowed |
| 429 | `ai_limit_reached` | An allowance is used up. `state` says which and `resets_at` when it comes back |
| 429 | `rate_limit_exceeded` | Twenty questions and deletions a minute, shared with the website |

The `409` as it comes back:

```json
{
    "error": {
        "type": "invalid_request_error",
        "code": "ai_answer_in_progress",
        "message": "The assistant is still answering in this conversation. Wait for it, or stop it, and ask again.",
        "doc_url": "https://proppertrading.com/docs/api/errors#ai_answer_in_progress",
        "request_id": "req_01m5gn55x271ets01x4sxxx3c8"
    }
}
```