List Messages

Read a conversation thread oldest-first. Unlike the other v1 chat lists this one is cursor-paginated: omit before for the latest page, then pass meta.before from each response to walk backwards until meta.hasMore is false. Deleted messages are returned with a null content and no attachments rather than being omitted, so the thread's shape is preserved. Every operation is scoped by the required workspaceId. A workspace-scoped API key that names any other workspace is refused with 403 before any query runs, so a workspace key can only ever reach its own workspace.

GET/api/v1/chat/conversations/{conversationId}/messages
X-API-Key<token>

Your Studio API key, personal or workspace-scoped. Generate one under Settings, then API Keys. Operations that reject workspace keys say so in their own description.

In: header

Path Parameters

conversationId*string

Conversation whose thread is read.

Length1 <= length

Query Parameters

workspaceId*string

Workspace the conversation belongs to.

Length1 <= length
before?string

ISO 8601 cursor. Returns messages created strictly before this instant. Omit for the latest page, then pass meta.before from the previous response to walk backwards.

Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
Formatdate-time
limit?integer

Messages per page, between 1 and 100. Defaults to 20.

Default20
Range1 <= value <= 100

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://agent-studio.seeyu.ai/api/v1/chat/conversations/string/messages?workspaceId=string" \  -H "X-API-Key: YOUR_API_KEY"
{
  "messages": [
    {
      "id": "msg_01J9M4Q0X6RA",
      "conversationId": "conv_01J9M4Q0X6R7",
      "content": "Thanks, that fixed it!",
      "messageType": "incoming",
      "private": false,
      "contentType": "text",
      "senderType": "Contact",
      "senderId": "cnt_01J8F2K3N5P9",
      "attachments": [],
      "inReplyToId": null,
      "contentAttributes": null,
      "status": null,
      "createdAt": "2026-08-28T14:22:05.000Z"
    }
  ],
  "meta": {
    "before": null,
    "hasMore": false
  }
}
{
  "error": "Invalid input: expected string, received undefined",
  "details": [
    {
      "code": "invalid_type",
      "expected": "string",
      "path": [
        "phone"
      ],
      "message": "Invalid input: expected string, received undefined"
    }
  ]
}
{
  "error": "Unauthorized"
}
{
  "error": "API key is not authorized for this workspace"
}
{
  "error": "Conversation not found"
}
{
  "error": "Rate limit exceeded",
  "message": "API rate limit exceeded. Please retry after 2026-09-13T12:00:00.000Z",
  "retryAfter": 1789286400000
}
{
  "error": "Internal server error",
  "requestId": "req_01J9Z2K3M4N5P6Q7R8S9T0"
}