Add a folder of this computer to a conversation
const url = 'https://api.asklucy.eu/v1/conversations/example/local-folders';const options = { method: 'POST', headers: { 'Lucy-Device': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"name":"Contracts"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.asklucy.eu/v1/conversations/example/local-folders \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Lucy-Device: example' \ --data '{ "name": "Contracts" }'The desktop app’s page, after the person picked a folder in the
app’s native picker (docs/device-contract.md “Folders of a
conversation”). Only from the desktop app (403
…/errors/not-desktop-app), with Lucy-Device naming one of your
devices (else 400 …/errors/invalid-device); 403
…/errors/local-access-off while the organization’s local_files
is off. The conversation’s local_device_id becomes that device;
folders on another device are removed. A name the conversation has
already changes nothing. At most 20 folders (409
…/errors/too-many-folders). Audited as local.folder_added.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Header Parameters
Section titled “Header Parameters”This computer’s device ID.
Request Bodyrequired
Section titled “Request Bodyrequired”object
The name the desktop app gave the picked folder (unique in the conversation; no / or \\).
Responses
Section titled “Responses”OK
object
Set by the user, or by Lucy after the first answer.
Last message or change.
object
Zitadel user ID.
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.
The answer Lucy is writing right now, if any.
When the retention policy deletes it.
The computer this conversation’s folders are on (one of the person’s devices), if any.
The folders of the person’s computer (local_device_id) added to
this conversation in the desktop app, by name (never their paths).
Lucy reaches them only for messages sent from the desktop app on
that computer.
object
The model chosen for this conversation’s answers (a Model.id);
null is Auto. It stays when the person can no longer choose,
but then answers use Auto.
How long Lucy’s sandbox keeps what it saved: a paused workspace (the files of a conversation after a few idle minutes) and published pages. Days; a field that is null or absent is inherited. The organization’s value is the default and the ceiling: a person or a conversation can only choose a shorter time. The effective value is the shortest that applies, within the platform’s maximum.
object
0 keeps no paused workspace (an idle sandbox is deleted with its files).
The agent run a conversation belongs to.
object
Whom the agent acts as.
owner: its creator, with exactly their access (their memory, their Microsoft 365, their quotas). Its runs are their conversations: they can read and continue them as themselves.service: itself (its ID is its principal). It reaches only what it was given: its knowledge files and the tools below, never anyone’s Microsoft 365. Only org_admins create and see service agents; their runs are read-only.
True for service runs, which nobody can continue.
The summary of the earlier conversation this one starts from:
Lucy reads it in every answer here. Plain text with short
headings. Only when one conversation is returned (GET /conversations/{id}, and the responses that create or change
one); null in lists, and for a conversation that continues none.
Only in search results (GET /conversations?q=…), where the search found it.
object
How the search found the conversation: words (in the title or the
messages), meaning (a passage close to q), or both.
The message that matches best, to open the conversation at. Null when only the title matched.
A few lines of that message, as plain text (no Markdown), with …
where it was cut: around the words found, or, found only by
meaning, the start of the passage that matched (no highlights then).
Null when only the title matched.
The words found in snippet, in order, as [start, end) offsets in
UTF-16 code units (JavaScript string indices). Empty when there is no
snippet.
object
Example
{ "id": "conv_2YgP0x", "created_by": { "kind": "person" }, "local_folders": [ { "name": "Contracts" } ], "model": "mistral-large-4-0", "agent_run": { "identity": "owner" }, "match": { "found_by": [ "words" ], "message_id": "msg_9Qa1Zt", "role": "user", "snippet": "… the invoices for March are due on the 15th, and the …" }}The request is invalid; errors lists what’s wrong.
RFC 9457 problem details.
object
For quota-exceeded, the window that is used up.
object
Null for a rolling window that hasn’t started.
organization when the organization’s budget is closer to running out than the member’s own limit.
Field-level problems (400 only).
object
JSON pointer into the request body.
Example
{ "type": "https://docs.asklucy.eu/errors/answer-in-progress", "quota": { "window": "five_hours", "limited_by": "personal", "request": { "status": "pending" } }}Headers
Section titled “Headers”Unique per request; quote it to support.
Missing, expired or invalid token.
RFC 9457 problem details.
object
For quota-exceeded, the window that is used up.
object
Null for a rolling window that hasn’t started.
organization when the organization’s budget is closer to running out than the member’s own limit.
Field-level problems (400 only).
object
JSON pointer into the request body.
Example
{ "type": "https://docs.asklucy.eu/errors/answer-in-progress", "quota": { "window": "five_hours", "limited_by": "personal", "request": { "status": "pending" } }}Headers
Section titled “Headers”Unique per request; quote it to support.
The token is valid but lacks the role this needs.
RFC 9457 problem details.
object
For quota-exceeded, the window that is used up.
object
Null for a rolling window that hasn’t started.
organization when the organization’s budget is closer to running out than the member’s own limit.
Field-level problems (400 only).
object
JSON pointer into the request body.
Example
{ "type": "https://docs.asklucy.eu/errors/answer-in-progress", "quota": { "window": "five_hours", "limited_by": "personal", "request": { "status": "pending" } }}Headers
Section titled “Headers”Unique per request; quote it to support.
No such object in your organization.
RFC 9457 problem details.
object
For quota-exceeded, the window that is used up.
object
Null for a rolling window that hasn’t started.
organization when the organization’s budget is closer to running out than the member’s own limit.
Field-level problems (400 only).
object
JSON pointer into the request body.
Example
{ "type": "https://docs.asklucy.eu/errors/answer-in-progress", "quota": { "window": "five_hours", "limited_by": "personal", "request": { "status": "pending" } }}Headers
Section titled “Headers”Unique per request; quote it to support.
The object isn’t in a state that allows this (e.g. Lucy is already answering).
RFC 9457 problem details.
object
For quota-exceeded, the window that is used up.
object
Null for a rolling window that hasn’t started.
organization when the organization’s budget is closer to running out than the member’s own limit.
Field-level problems (400 only).
object
JSON pointer into the request body.
Example
{ "type": "https://docs.asklucy.eu/errors/answer-in-progress", "quota": { "window": "five_hours", "limited_by": "personal", "request": { "status": "pending" } }}Headers
Section titled “Headers”Unique per request; quote it to support.
/conversations/{conversationId}/local-folders curl -X POST "https://api.asklucy.eu/v1/conversations/conv_7Hq2mKx9Rt/local-folders" \
-H "Authorization: Bearer $LUCY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Contracts"
}'