> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usepatchwork.co/llms.txt
> Use this file to discover all available pages before exploring further.

# The Message object

> One line on a thread. Posting a user message starts or resumes a run.

Listing a thread returns messages in sequence. Posting a message does **not** return the assistant reply — it returns `202` and a run.

Accepted:

```json theme={null}
{
  "run_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "state": "running"
}
```

Listed:

```json theme={null}
{
  "id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "role": "user",
  "content": "Send 50 USDC to Jane",
  "run_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "seq": 1,
  "created_at": "2026-08-16T11:58:01Z"
}
```

If a run on the thread is `awaiting_input`, the next `POST` is the answer and the run resumes. Otherwise a new run starts.

## Attributes

<ResponseField name="id" type="uuid">
  Unique identifier for the message. Present on list, not on the `202`.
</ResponseField>

<ResponseField name="role" type="enum">
  `user`, `assistant`, or `system`.
</ResponseField>

<ResponseField name="content" type="string">
  Message text.
</ResponseField>

<ResponseField name="run_id" type="uuid">
  Run that produced or accepted this message.
</ResponseField>

<ResponseField name="seq" type="integer">
  Position on the thread.
</ResponseField>

<ResponseField name="created_at" type="timestamp">
  When the message was written.
</ResponseField>

<ResponseField name="thread_id" type="uuid">
  Thread the run belongs to. Present on the `202`.
</ResponseField>

<ResponseField name="state" type="enum">
  Run state at accept time. See [The Run object](/api-reference/run).
</ResponseField>

## Endpoints

* [Send a message](/api-reference/loom/send-a-message) — `POST /v1/loom/threads/:thread_id/messages`
* [List messages](/api-reference/loom/list-messages) — `GET /v1/loom/threads/:thread_id/messages`
