Start a thread
const url = 'http://localhost:11044/api/v1/threads';const options = { method: 'POST', headers: {'X-Embabel-Api-Key': '<X-Embabel-Api-Key>', 'Content-Type': 'application/json'}, body: '{"title":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://localhost:11044/api/v1/threads \ --header 'Content-Type: application/json' \ --header 'X-Embabel-Api-Key: <X-Embabel-Api-Key>' \ --data '{ "title": "example" }'Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”The new thread’s title, trimmed; omitted or blank, the thread is called Untitled. The thread starts empty and belongs to the caller
A thread to start; sent to POST /threads
object
Title for the thread, trimmed; blank or absent makes it “Untitled”
Example generated
{ "title": "example"}Responses
Section titled “Responses”The thread
A conversation the caller shares with their agents. GET /threads lists them, POST /threads answers the one it started, and GET /threads/{id} carries it with its messages.
object
When the thread was started, as an ISO-8601 instant
Thread id, a UUIDv7 string; the {id} in /threads/{id}
User id of the person who owns the thread; always the caller, since only the owner can read it
Title as given when the thread was started, trimmed; “Untitled” when none was given
Last activity in the thread, as an ISO-8601 instant; the list is sorted on it, newest first
Example generated
{ "createdAt": "2026-04-15T12:00:00Z", "id": "example", "ownerId": "example", "title": "example", "updatedAt": "2026-04-15T12:00:00Z"}No authenticated principal
A refusal with a machine-readable code and a plain-language message. ApiErrorAdvice answers it for a failed validation, a missing resource or a conflicting state, and some controllers answer it directly
object
Machine-readable key to branch on, such as validation_failed, unknown_field, not_found or conflict. Open: a surface may answer codes of its own
Extra context where there is some, such as the fields a body may carry; null otherwise
A plain-language explanation, written to be shown. Never carries an exception message
The body the servlet error dispatch answers for a status raised by an exception rather than written by the endpoint. Every failure except 404, which answers the not-found HTML page
object
The status’s standard reason phrase, such as Bad Request or Forbidden
The request path that failed
The HTTP status code, repeated from the status line
Example generated
{ "code": "example", "detail": "example", "message": "example"}
