Skip to content

Get a message

GET
/conversations/{conversationId}/messages/{messageId}
curl --request GET \
--url https://api.asklucy.eu/v1/conversations/example/messages/example \
--header 'Authorization: Bearer <token>'
conversationId
required
string
/^conv_[A-Za-z0-9]+$/
messageId
required
string
/^msg_[A-Za-z0-9]+$/

OK

Media typeapplication/json
object
local_refs

For user messages, the local files and folders the person mentioned (@).

Array<object>

A file or folder on the conversation’s device that the person mentioned (@).

object
share
required
string
>= 1 characters <= 255 characters
path
required

<share>/<path>, or the share itself; no empty, . or .. parts.

string
<= 4096 characters
kind
required
string
Allowed values: file dir
id
required
string
conversation_id
required
string
role
required
string
Allowed values: user assistant
content
required

For an answer still being written, what’s been written so far.

Array
One of: discriminator: type
object
type
required
Allowed value: text
text
required

Markdown. Lucy links the conversation’s files as [name](lucy://file/<file_id>) and published pages or live previews as [title](lucy://artifact/<preview_id>) (Preview.id, on a step of the conversation): open them in the viewer. Treat an ID that isn’t in the conversation as plain text; http(s) links are ordinary links.

string
<= 100000 characters
status
required

User messages are always completed.

string
Allowed values: completed in_progress failed cancelled
steps

What Lucy did while writing this answer (assistant messages only).

Array<object>

Something visible Lucy did while answering, like running code.

object
id
required
string
kind
required

ui (experimental): UI Lucy drew in its answer, in ui; the chat draws it where the step is, between the text before and after it, rather than as a step.

string
Allowed values: code search read_file memory local ui
title

Short human label, e.g. “Analysing sales.xlsx” or “Following: Answer a custody-fee question (v3)”.

string
code

For code steps, what was run.

string | null
status
required

awaiting_approval: the step waits for the person. With approval set, on that card in the chat (a tool set to ask); a local step without one, on their computer. denied: they said no or didn’t answer.

string
Allowed values: running awaiting_approval succeeded failed timed_out denied
output_preview

The end of the output (stdout and stderr), cut to a few KB.

string | null
connector
One of:
object
id
required

The connector, e.g. m365.

string
name
required

Its name, e.g. “Microsoft 365”.

string
action
string
Allowed values: search read draft send book
approval
One of:

What Lucy wants to do and is waiting for the person’s yes on (a Step with status awaiting_approval): a call of a tool whose permission is ask for them. Answer it with decideApproval. The lines are what the call does, from its exact arguments (long text is cut for the card; the approval covers the whole of it).

object
id
required
string
title
required
string
server

The tool server that receives the call. Absent on cards from before tool permissions.

object
id
required
string
name
required
string
host

For a connector added by URL, the host that receives the call’s arguments.

string | null
shared

The call uses the organization’s shared account at that service.

boolean
tool

The tool’s name on its server. Absent on cards from before tool permissions.

string
choices

The answers to offer, in this order. approve_always only when the organization allows the tool (organization is allow). Absent on cards from before tool permissions: approve and deny.

Array<string>
Allowed values: approve approve_always deny deny_always
lines
required
Array<object>
object
label
required
string
value
required
string
why

The model’s own reason for this step, in a few sentences (an excerpt of its reasoning, at most 600 characters), set on the first step of a round when the model reasoned before calling tools. Absent for models that don’t reason. It is part of the message, so it is kept and deleted with the conversation. Shown in the conversation’s Record; a record of the model’s working, not proof of why it acted.

string | null
started_at
required
string format: date-time
finished_at
string | null format: date-time
memory
One of:
object
action
required
  • found_processes, read_process: Lucy looked for a process that fits, or read one to follow it.
  • searched, recalled: Lucy looked facts up (by search, or around an entity).
  • remembered: Lucy kept facts or relations in your memory.
  • saved_process: Lucy wrote or changed a process in your own scope; proposed_process: she proposed one for a group or the organization (an admin reviews it).
  • forgot, shared: Lucy forgot something, or shared it (after you said yes).
string
Allowed values: found_processes read_process searched recalled remembered saved_process proposed_process forgot shared
items
required

What the step touched, to show and link to.

Array<object>
object
type
required
string
Allowed values: fact entity relation process_version
id
required
string
label
required

The fact’s text, the entity’s name, the relation in words, or the process’s title.

string
scope
required

Who a piece of memory is for: user (only you, and Lucy when she works for you), group:<groupId> (the members of a group from the identity provider) or org (everyone in the organization).

string
/^(user|org|group:.+)$/
process_id

For process_version.

string | null
version

For process_version.

integer | null
undo
required

The step wrote to your own memory and can be undone: forget its fact and relation items (deleteMemoryFact, deleteMemoryRelation) and withdraw its process_version items (withdrawProcessVersion). Entities stay.

boolean
local
One of:
object
device_id
required
string
device_name
required
string
tool
required

The shell comes with a later phase.

string
Allowed values: list search view attach write edit mkdir move delete save
share

The shared folder, by its name.

string | null
path

The path inside the shares, <share>/<path> (for move, where from).

string | null
change
One of:
object
id

The change’s ID on the device (chg_…), for undoLocalChange.

string | null
undone_at

When the person undid it.

string | null format: date-time
operation
required
string
Allowed values: create overwrite edit mkdir move delete save
path
required
string
to_path

For move, where to.

string | null
size_bytes

The file’s size after the change (for delete, before).

integer | null
diff

For edit and overwrite of text, a unified diff (at most 16,000 characters).

string | null
previous

For edit and overwrite, the previous version’s name in the Trash.

string | null
previews

Things to open from the step: a live preview of an app running in Lucy’s sandbox, or a page she published. The links carry their own access token and expire (expires_at): show them in a sandboxed frame or a new tab, never trust their content, and say so when one has expired.

Array<object>
<= 5 items
object
id

Stable ID of the preview, which the answer links as lucy://artifact/<id>. Absent on previews made before 2026-11-03.

string
kind
required

live: a web app running in the sandbox (works while the sandbox and its server run, minutes to hours). artifact: a frozen static page that outlives the sandbox (link valid for days).

string
Allowed values: live artifact
title
required
string
<= 120 characters
url
required

An https link to open. Contains an access token.

string format: uri
expires_at
string | null format: date-time
weather
One of:

The weather in one place, from a web search. Temperatures are in degrees Celsius; the chat converts them to the units the person uses.

object
place
required
string
<= 120 characters
current
required
object
temp_c
required
number
condition
required
string
Allowed values: clear partly_cloudy cloudy fog drizzle rain showers thunder snow sleet wind
summary
required
string
<= 40 characters
night
required

It is dark there now.

boolean
days
required

Today in that place first, then the days after, in order.

Array<object>
<= 10 items
object
date
required
string format: date
high_c
required
number
low_c
required
number
condition
required
string
Allowed values: clear partly_cloudy cloudy fog drizzle rain showers thunder snow sleet wind
precip_chance
required

Chance of rain or snow in percent, when the sources give one.

number | null
<= 100
sources
required
Array<object>
<= 8 items
object
title
required
string
url
required
string format: uri
ui

A2UI v0.9 server-to-client messages (a2ui.org) a tool gave for this step, or Lucy drew (kind ui): a surface, its components from Lucy’s catalog (https://asklucy.eu/a2ui/catalogs/lucy/v1.json) and their data. The chat draws them with its own components; nothing in them runs. Absent when the tool gave none. Experimental.

Array<object>
<= 20 items
object
version
required
string
Allowed value: v0.9
key
additional properties
any
error
One of:
null
completed_at

When the answer finished (any final status).

string | null format: date-time
last_event_id

For an answer still being written: the last event already included in this snapshot. Open the events stream with this as Last-Event-ID to continue live from here (after a refresh, or on another device).

string | null
feedback
One of:
object
rating
required
string
Allowed values: positive negative
reason
string | null
comment
string | null
updated_at
required
string format: date-time
created_by
One of:
object
id
required

Zitadel user ID.

string
name
required
string
email
string | null format: email
kind

service is a customer system’s Zitadel service user; agent is a service agent (its ID is the agt_ ID), the author of its runs’ messages.

string
Allowed values: person service agent
created_at
required
string format: date-time
model
One of:
object
id
required
string
label
required
string
model_fallback
One of:
object
reason
required

no_vision: the turn had an image (or a tool showed one) and the model can’t read images. no_tools: it needed tools the model can’t use. too_long: the conversation is longer than its context. unavailable: the model didn’t answer (Lucy used a stand-in) or is no longer offered by Lucy. not_allowed: you may no longer choose it, so Lucy chose (and model is null).

string
Allowed values: no_vision no_tools too_long unavailable not_allowed
requested
required
object
id
required
string
label
required
string
message
required

For people, e.g. “Codestral can’t read images.”

string

Example

{
"local_refs": [
{
"share": "Contracts",
"path": "Contracts/2024/acme.pdf",
"kind": "file"
}
],
"id": "msg_9Qa1Zt",
"role": "user",
"content": [
{
"type": "text"
}
],
"status": "completed",
"steps": [
{
"kind": "code",
"status": "running",
"connector": {
"action": "search"
},
"approval": {
"id": "apr_8Qk2LmN4Rt7Wx1Yz3Aa5",
"title": "Send an email",
"server": {
"id": "m365",
"name": "Microsoft 365",
"host": "mcp.acme.example"
},
"tool": "mail_send",
"choices": [
"approve"
],
"lines": [
{
"label": "To",
"value": "harry@example.test"
}
]
},
"memory": {
"action": "found_processes",
"items": [
{
"type": "fact",
"id": "prv_7Hc2Lw",
"scope": "user"
}
]
},
"local": {
"device_name": "Thibaut's MacBook",
"tool": "list",
"share": "Contracts",
"path": "Contracts/2024/acme.pdf",
"change": {
"id": "chg_4kVt9sQm2Lp8Xw0RbN3e",
"operation": "create",
"path": "Reports/q3.md"
}
},
"previews": [
{
"id": "prv_8Hq2xT",
"kind": "live"
}
],
"weather": {
"place": "Las Vegas, NV",
"current": {
"condition": "clear",
"summary": "Sunny"
},
"days": [
{
"condition": "clear"
}
]
},
"ui": [
{
"version": "v0.9"
}
]
}
],
"error": {
"code": "sandbox_timeout"
},
"feedback": {
"rating": "positive"
},
"created_by": {
"kind": "person"
},
"model_fallback": {
"reason": "no_vision"
}
}

Missing, expired or invalid token.

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
string
instance
string
request_id
string
quota

For quota-exceeded, the window that is used up.

object
window
required
string
Allowed values: five_hours week month
percent_used
required
number
<= 100
resets_at
required

Null for a rolling window that hasn’t started.

string | null format: date-time
limited_by
required

organization when the organization’s budget is closer to running out than the member’s own limit.

string
Allowed values: personal organization
request
One of:

A request as its member sees it, where they asked.

object
id
required
string
status
required
string
Allowed values: pending approved declined withdrawn
created_at
required
string format: date-time
decided_at
required
string | null format: date-time
note
required

What the admin who decided wrote back.

string | null
errors

Field-level problems (400 only).

Array<object>
object
field
required

JSON pointer into the request body.

string
message
required
string

Example

{
"type": "https://docs.asklucy.eu/errors/answer-in-progress",
"quota": {
"window": "five_hours",
"limited_by": "personal",
"request": {
"status": "pending"
}
}
}
X-Request-Id
string

Unique per request; quote it to support.

No such object in your organization.

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
string
instance
string
request_id
string
quota

For quota-exceeded, the window that is used up.

object
window
required
string
Allowed values: five_hours week month
percent_used
required
number
<= 100
resets_at
required

Null for a rolling window that hasn’t started.

string | null format: date-time
limited_by
required

organization when the organization’s budget is closer to running out than the member’s own limit.

string
Allowed values: personal organization
request
One of:

A request as its member sees it, where they asked.

object
id
required
string
status
required
string
Allowed values: pending approved declined withdrawn
created_at
required
string format: date-time
decided_at
required
string | null format: date-time
note
required

What the admin who decided wrote back.

string | null
errors

Field-level problems (400 only).

Array<object>
object
field
required

JSON pointer into the request body.

string
message
required
string

Example

{
"type": "https://docs.asklucy.eu/errors/answer-in-progress",
"quota": {
"window": "five_hours",
"limited_by": "personal",
"request": {
"status": "pending"
}
}
}
X-Request-Id
string

Unique per request; quote it to support.