Skip to content

Add a folder of this computer to a conversation

POST
/conversations/{conversationId}/local-folders
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.

conversationId
required
string
/^conv_[A-Za-z0-9]+$/
Lucy-Device
required
string
/^dev_[A-Za-z0-9]+$/

This computer’s device ID.

Media typeapplication/json
object
name
required

The name the desktop app gave the picked folder (unique in the conversation; no / or \\).

string
>= 1 characters <= 80 characters

OK

Media typeapplication/json
object
id
required
string
title
required

Set by the user, or by Lucy after the first answer.

string
created_at
required
string format: date-time
updated_at
required

Last message or change.

string format: date-time
created_by
required
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
answering_message_id

The answer Lucy is writing right now, if any.

string | null
expires_at

When the retention policy deletes it.

string | null format: date-time
local_device_id

The computer this conversation’s folders are on (one of the person’s devices), if any.

string | null
local_folders

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.

Array<object>
object
name
required
string
>= 1 characters <= 80 characters
added_at
required
string format: date-time
model

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.

string | null
sandbox_retention

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
snapshot_days

0 keeps no paused workspace (an idle sandbox is deleted with its files).

integer | null
artifact_days
integer | null
>= 1
agent_run
One of:

The agent run a conversation belongs to.

object
agent_id
required
string
run_id
required
string
identity
required

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.
string
Allowed values: owner service
read_only
required

True for service runs, which nobody can continue.

boolean
carried_from
One of:
object
id
required
string
title
required
string
carried_summary

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.

string | null
match

Only in search results (GET /conversations?q=…), where the search found it.

object
found_by
required

How the search found the conversation: words (in the title or the messages), meaning (a passage close to q), or both.

Array<string>
>= 1 items
Allowed values: words meaning
message_id
required

The message that matches best, to open the conversation at. Null when only the title matched.

string | null
role
required
One of:
string
Allowed values: user assistant
snippet
required

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.

string | null
highlights
required

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.

Array<object>
object
start
required
integer
end
required
integer

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.

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.

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.

The token is valid but lacks the role this needs.

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.

The object isn’t in a state that allows this (e.g. Lucy is already answering).

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.

POST/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"
}'

Try it

Nothing is sent without a token.